若何在C++中樹立一個次序表。本站提示廣大學習愛好者:(若何在C++中樹立一個次序表)文章只能為提供參考,不一定能成為您想要的結果。以下是若何在C++中樹立一個次序表正文
預備數據
#define MAXLEN 100 //界說次序表的最年夜長度
struct DATA
{
char key[10]; //結點的症結字
char name[20];
int age;
};
struct SLType //界說次序表構造
{
DATA ListData[MAXLEN+1];//保留次序表的構造數組
int ListLen; //次序表已存結點的數目
};
界說了次序表的最年夜長度MAXLEN、次序表數據元素的類型DATA和次序表的數據構造SLType。
在數據構造SLType中,Listen為次序表已存結點的數目,也就是以後次序表的長度,ListData是一個構造數組,用來寄存各個數據結點。
我們以為該次序表是一個班級先生的記載。個中,key為學號,name為先生的稱號,age為年紀。
由於數組都是從下標0開端的,為了應用便利,我們從下標1開端記載數據結點,下標0的地位弗成用。
初始化次序表
在應用次序表之前,起首創立一個空的次序表,也就是初始化次序表。這裡,在法式中只需設置次序表的結點數目ListLen為0便可。如許,前面須要添加的數據元素將從次序表的第一個地位存儲。
示例代碼:
void SLInit(SLType * SL) //初始化次序表
{
SL->Listlen=0;
}
盤算線性表的長度
盤算線性表的長度也就是盤算線性表中結點的個數,因為我們在SLType中界說了ListLen來表現結點的數目,所以我們只須要取得這個變量的值便可。
int SLLenght(SLType *SL)
{
return(SL->ListLen); //前往次序表的元素數目
}
拔出結點
拔出節點就是在線性表L的第i個地位上拔出一個新的結點,使厥後的結點編號順次加1。
這時候,拔出一個新節點以後,線性表L的長度將變成n+1。拔出結點操作的難點在於隨後的每一個結點數據都要向後挪動,盤算機比擬年夜,示例代碼以下:
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXLEN) //次序表結點數目已跨越最年夜數目
{
cout<<"次序表已滿,不克不及拔出結點!"<<endl;
return 0; //前往0表現拔出不勝利
}
if(n<1||n>SL->ListLen) //拔出結點的序號不正當
{
cout<<"拔出序號毛病!"<<endl;
return 0;
}
for(i=SL->ListLen;i>=n;i--) //將次序表中的數據向後挪動
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1;
}
在法式中起首斷定次序表結點數目時刻已跨越最年夜數目,和拔出點的序號能否准確。後面前提都瞞住今後,便將次序表中的數據向後挪動,同時拔出結點,並更新結點數目ListLen。
追加結點
追加結點就是在次序表的尾部拔出結點,是以不用停止年夜量數據的挪動,代碼完成與拔出結點比擬就要簡略的多。
int SLAdd(SLType * SL,DATA data)
{
if(SL->ListLen>=MAXLEN)
{
cout<<"次序表已滿,不克不及再添加結點了!"<<endl;
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
刪除結點
刪除結點就是刪除線性表L中的第i個結點,使得厥後的一切節點編號順次減1.這是,刪除一個結點以後,線性表L的長度將變成n-1。刪除結點和拔出結點相似,都須要停止年夜量數據的挪動。
int SLDelete(SLType *SL,int n) //刪除次序表中的數據元素
{
int i;
if(n<1||n>SL->ListLen) //刪除結點的序號不正當
{
cout<<"刪除序號毛病!"<<endl;
return 0;
}
for(i=n;i<SL->ListLen;i++)//將次序表中的數據向前挪動
{
SL->ListData[i]=SL->ListData[i+1];
}
SL->ListLen--; //次序表元素數目減1
return 1; //勝利刪除前往1
}
查找結點
查找節點就是在線性表L中查找值為x的結點,並前往該節點在線性表L中的地位。假如在線性表中沒有找到值為x的結點,則前往一個毛病標記。
依據x的類型分歧,查找結點可以分為:
依照序號查找結點
關於一個次序表,序號就是數據元素在數組中的地位,也就是數組的下標標號。依照序號查找結點是次序表查找結點最經常使用的辦法,這是由於次序表的存儲自己就是一個數組,示例代碼以下:
DATA * SLFindByNum(SLType *SL,int n)//依據呼號前往數據元素
{
if(n<1||n>SL->ListLen) //查詢結點的序號不正當
{
cout<<"查詢序號毛病!"<<endl;
return 0;
}
return &(SL->ListData[n]);
}
依照症結字查找結點
症結字可所以數據元素中的隨意率性一項。
這裡以key症結字為例停止引見,例如,可以經由過程key查找先生的信息。示例代碼以下:
int SLFindByCont(SLType * SL,char *key)//按症結字查詢結點
{
int i;
for(i=1;i<=SL->ListLen;i++)
{
if(strcmp(SL->ListData[i].key,key)==0)//假如找到結點
{
return i;
}
}
return 0; //在全部表中都沒有找到,前往0
}
顯示一切的結點
示例代碼以下:
void SLALL(SLType *SL)
{
int i;
for(i=1;i<SL->ListLen;i++)
{
cout<<"key:"<<SL->ListData[i].key<<endl;
cout<<"name:"<<SL->ListData[i].name<<endl;
cout<<"age:"<<SL->ListData[i].age<<endl;
cout<<"============================="<<endl;
}
}
次序表操作完全示例:
根本上就是把下面的函數放到一塊,集中展現了一下功效,代碼有些長,請耐煩浏覽^.^
#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 100 //界說次序表的最年夜長度
/**************次序表的界說部門*****************/
struct DATA
{
string key; //結點的症結字
string name;
int age;
};
struct SLType //界說次序表構造
{
DATA ListData[MAXLEN+1];//保留次序表的構造數組
int ListLen; //次序表已存結點的數目
};
/************次序表的初始化函數*****************/
void SLInit(SLType * SL) //初始化次序表
{
SL->ListLen=0;
}
/***********盤算線性表的長度*******************/
int SLLenght(SLType *SL)
{
return(SL->ListLen); //前往次序表的元素數目
}
/*********拔出結點*******************************/
int SLInsert(SLType *SL,int n,DATA data)
{
int i;
if(SL->ListLen>=MAXLEN) //次序表結點數目已跨越最年夜數目
{
cout<<"次序表已滿,不克不及拔出結點!"<<endl;
return 0; //前往0表現拔出不勝利
}
if(n<1||n>SL->ListLen) //拔出結點的序號不正當
{
cout<<"拔出序號毛病!"<<endl;
return 0;
}
for(i=SL->ListLen;i>=n;i--) //將次序表中的數據向後挪動
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1; //勝利拔出,前往1
}
/***********************追加結點*************************/
int SLAdd(SLType * SL,DATA data)
{
if(SL->ListLen>=MAXLEN)
{
cout<<"次序表已滿,不克不及再添加結點了!"<<endl;
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
/***********************刪除結點*************************/
int SLDelete(SLType *SL,int n) //刪除次序表中的數據元素
{
int i;
if(n<1||n>SL->ListLen) //刪除結點的序號不正當
{
cout<<"刪除序號毛病!"<<endl;
return 0;
}
for(i=n;i<SL->ListLen;i++)//將次序表中的數據向前挪動
{
SL->ListData[i]=SL->ListData[i+1];
}
SL->ListLen--; //次序表元素數目減1
return 1; //勝利刪除前往1
}
/*******************依照序號查找結點********************/
DATA * SLFindByNum(SLType *SL,int n)//依據序號前往數據元素
{
if(n<1||n>SL->ListLen) //查詢結點的序號不正當
{
cout<<"查詢序號毛病!"<<endl;
return 0;
}
return &(SL->ListData[n]);
}
/*******************依照症結字查找結點********************/
DATA *SLFindByCont(SLType * SL,string name)//按症結字查詢結點
{
int i;
for(i=1;i<=SL->ListLen;i++)
{
if(SL->ListData[i].name==name)//假如找到結點
{
return &(SL->ListData[i]);
}
}
return 0; //在全部表中都沒有找到,前往0
}
/*******************顯示一切的結點********************/
void SLALL(SLType *SL)
{
int i;
for(i=1;i<=SL->ListLen;i++)
{
cout<<"key:"<<SL->ListData[i].key<<",name:"<<SL->ListData[i].name<<",age:"<<SL->ListData[i].age<<endl;
}
}
int main()
{
int i;
SLType SL; //界說次序表變量
DATA data; //界說結點保留數據類型變量
DATA *pdata;//界說指向結點的指針變量
string name;
cout<<"次序表操作演示:"<<endl;
SLInit(&SL);//初始化次序表
do
{ //輪回添加結點數據
cout<<"請輸出要添加的結點(學號 姓名 年紀):";
cin>>data.key>>data.name>>data.age;
if(data.age) //若年紀不為0
{
if(!SLAdd(&SL,data))//若添加結點掉敗
{
break; //加入輪回
}
}else
{
break;
}
}while(1);
cout<<"次序表中的結點次序為:" <<endl;
SLALL(&SL); //顯示一切的結點
cout<<"請輸出要掏出的結點序號:";
cin>>i;
pdata=SLFindByNum(&SL,i);//順次號查找結點
if(pdata)
{
cout<<"第"<<i<<"個結點為:key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
}
cout<<"請輸出要查找的姓名:";
cin>>name;
pdata=SLFindByCont(&SL,name);
if(pdata)
{
cout<<"key:"<<pdata->key<<",name:"<<pdata->name<<",age:"<<pdata->age<<endl;
}
cout<<"請輸出您要刪除的結點的序號:";
cin>>i;
if(SLDelete(&SL,i))
{
cout<<"數據刪除勝利"<<endl;
SLALL(&SL);
}
cout<<"請輸出您要拔出的結點的序號:";
cin>>i;
cout<<"請輸出第"<<i<<"號結點的key,name,和age"<<endl;
cin>>data.key>>data.name>>data.age;
if(SLInsert(&SL,i,data))
{
cout<<"拔出數據勝利"<<endl;
SLALL(&SL);
}
return 0;
}
運轉界面: