数据结构中构建顺序表,数据结构构建顺序
顺序表指的是数据元素在内存中连续分配地址的数组,由于指针无法指出数组长度,编译时不会报错,所有用结构体来表示一个顺序表:
顺序表用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是否在表内可以换成其他数
}