順序表指的是資料元素在記憶體中連續配置設定位址的數組,由于指針無法指出數組長度,編譯時不會報錯,所有用結構體來表示一個順序表:
順序表用C語言的表示方法如下:
<span style="font-family: Arial, Helvetica, sans-serif;"> #define OK 1</span>
#define ERROR -1
typedef int elem_type;
typedef int Statue;
// int Arrylength;
typedef struct sqlist
{
elem_type *Arry;
int Arrylength;
} Sqlist;
//建立一個空表
Statue Create_Sqlist(Sqlist *&S)
{
//S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type));
//L = (sqlist *)malloc(sizeof(sqlist));
// L->data = (char *)malloc(maxsize);
S = (Sqlist *)malloc(sizeof(Sqlist));
S->Arry = (elem_type *)malloc(MaxSize);
if(!S->Arry)
{
return ERROR;
}
else
{
S->Arrylength = 0;
return OK;
}
}
//順序表賦初始值
void Init_Sqlist(Sqlist *&S)
{
int i;
for(i=0;i<20;i++)
{
S->Arry[i]=rand()%100;
S->Arrylength++;
}
}
//在第i個位置添加一個元素m
Statue Insert_Sqlist(Sqlist *&S,int i,int InsertNum)
{
if(i<=0 && i>S->Arrylength)
return ERROR;
else
{
int j;
for(j=0;j<=S->Arrylength-i;j++)
S->Arry[S->Arrylength-j]=S->Arry[S->Arrylength-1-j]; //i以後元素往後移動一位
S->Arry[i-1]=InsertNum;
S->Arrylength++;
return OK;
}
}
//将第i個元素删除
Statue Delete_Sqlist(Sqlist *&S,int i)
{
if(i<=0 && i>S->Arrylength)
return ERROR;
else
{
int j;
for(j=0;j<=S->Arrylength-i;j++)
S->Arry[i-1+j]= S->Arry[i+j];
S->Arrylength--;
return OK;
}
}
//删除值為x的元素
void DeleteX_Sqlist(Sqlist *&S,int x)
{
int i;
for(i=0;i< S->Arrylength;i++)
{
if(x == S->Arry[i])
{
//Delete_Sqlist( *S, i);
int j;
for(j=0;j<=S->Arrylength-i;j++)
S->Arry[i+j]= S->Arry[i+j+1];
S->Arrylength--;
}
}
}
//列印函數
void print(Sqlist *&S)
{
int m;
for(m=0;m<S->Arrylength;m++)
{
cout<<setw(4)<<S->Arry[m];
if((m+1)%4==0)
cout<<endl;
}
}
int main()
{
Sqlist *p1;
Create_Sqlist( p1);
cout<<"建立順序表is OK"<<endl;
Init_Sqlist(p1);
cout<<"初始化順序表is OK,資料如下:"<<endl;
print(p1);
int i,InsertNum;
cout<<"輸入兩個如下:";
cin>>i;cin>>InsertNum;
cout<<"插入數操作如下:在第"<<i<<"行插入數字"<<InsertNum<<"後。結構顯示如下:"<<endl;
Insert_Sqlist( p1, i, InsertNum);
print(p1);
int k;
cout<<endl;
cout<<"輸入一個數如下:";
cin>>k;
cout<<"删除數操作如下:"<<endl;
cout<<"想要删除第"<<k<<"個數 顯示如下:"<<endl;
Delete_Sqlist(p1,k);
print(p1);
int j;
cout<<"輸入一個數"<<endl;
cin>>j;
cout<<"删除指定數操作如下:輸入想要删除的數是:"<<j<<" 結果顯示如下:"<<endl;
DeleteX_Sqlist(p1,j);
print(p1);
while(1);
return 0;
}
顯示結果如下:
分析比較下面代碼段的差别:
A段——建立空表沒有bug的代碼:
typedef struct sqlist
{
elem_type *Arry;
int Arrylength;
} Sqlist;
//建立一個空表
Statue Create_Sqlist(Sqlist *&S)
{
S = (Sqlist *)malloc(sizeof(Sqlist));
S->Arry = (elem_type *)malloc(MaxSize);
}
B段——建立空表出現bug的代碼:
typedef struct sqlist
{
elem_type Arry[MaxSize];
int Arrylength;
} Sqlist;
//建立一個空表
Statue Create_Sqlist(Sqlist *S)
{
S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type)); }
A與B的主要差别是數組作為成員時的記憶體配置設定問題:
A中隻是定義了一個elem_type 類型的 指針變量,是以在定義結構類型時還沒有給 *Arry配置設定記憶體,可以通過S->Arry = malloc(MaxSize)來配置設定記憶體;
B中定義了數組類型Arry[MaxSize],一旦調用Sqlist類型,系統馬上自動給它配置設定記憶體,是以不需要再S->Arry = (elem_type *)malloc(MaxSize*sizeof(int))來配置設定記憶體。