資料結構中構建順序表,資料結構構建順序
順序表指的是資料元素在記憶體中連續分配地址的數組,由於指標無法指出數組長度,編譯時間不會報錯,所有用結構體來表示一個順序表:
順序表用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)); }
資料結構中的順序表怎編寫???
順序表怎麼編寫?
你建立一個固定的數組,或是申請一塊連續的記憶體空間。
把你要建立的資料,依次填入到數組對應的位置。
這樣你就可以對這個順序表,進行排序,輸出進行操作了。
資料結構中順序表的建立、尋找與折半尋找
//用vc調試過了有問題可以提出
#include<stdio.h>
#define listsize 100
typedef struct
{
int data[listsize];
int length;
}sqlist;//順序表的類型
void createtsqlist(sqlist &L,int a[],int n)//用數組建立順序表
{
L.length=0;
for(int i=0;i<n;i++)
{
L.data[L.length++]=a[i];
}
}
void findvalue(sqlist L,int x) //尋找x是否在順序表內
{
for(int i=0;i<L.length;i++)
{
if(L.data[i]==x)
{
printf("%d是第%d個元素\n",x,i+1);return;
}
}
printf("%d不在順序表內\n",x);
}
void search_bin(sqlist L,int x)//折半尋找有序表
{
int low=1;int high=L.length;int mid;
while(low<=high)
{
mid=(low+high)/2;
if(x==L.data[mid])
{
printf("%d是第%d元素\n",x,mid+1);return;
}
else if(x<L.data[mid])high=mid-1;
else low=mid+1;
}
printf("%d不在順序表內\n",x);
}
void main()
{
int a[10]={1,23,45,34,67,87,9,13,7,11};
int b[10]={1,2,3,4,5,6,9,14,19,23};//保證b中元素有序
sqlist L1,L2;//L2建立為有序表
createtsqlist(L1,a,10);
findvalue(L1,45);//尋找45是否在表內可以換成其他數
createtsqlist(L2,b,10);
search_bin(L2,14);//尋找14是否在表內可以換成其他數
}