这几天我尝试写写c语言顺序表,我是这样想的:在学链表之前,先搞懂顺序表。
不喜勿喷,本人新手,大多代码借鉴书上。如有错误之处,请原谅!
首先创建一个结构体:
typedef struct
{
ElemType *elem;//存储空间的基地址
int length;//当前长度
}Sqlist;//顺序表的结构类型为Sqlist
然后建立一个空表,并填上数据:
Status InitList(Sqlist &L)//建立一个空表
{
L.elem = new ElemType[MAXSIZE];
if(!L.length)
{
exit(OVERFLOW);//OVERFLOW需要重定义
}
L.length = 0;
return 0;
}
顺序表结构至此已经搭建好了,下一步便是往空表上填数据。
Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表
{
int b,i=0;
printf("表的长度: ");
scanf("%d",&L.length);
Interrupt();
printf("输入要填入表的数字:\n");
for( ; i < L.length ; i++ )
{
scanf("%d",&b);
L.elem[i] = b;
}
Interrupt();
return 0;
}
剩下的工作,便是对自己所创建的顺序表进行修改,装饰。
顺序表操作包括:增,删,查。
为了观察输入的顺序表是否正确,先增加个 遍历函数 。
Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来
{
int j;
if(L.length==0)
{
printf("空表\n");
return 0;
}
else
{
for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据
printf("%d ",L.elem[j]);
printf("\n");//最后换行
return 0;
}
}
顺序表的取值(按值查找):
Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数
{
scanf("%d",&i);
Interrupt();
if(i<0||i>L.length)//判断i的取值是否超范围
{
printf("ERROR\n");//如果超范围,返回ERROR,并结束
return 0;
}
else
{
e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出
printf("%d\n",e);
return 0;
}
}
顺序表的删除操作:
Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置
{
int j;
scanf("%d",&i);//输入要删除的第i位
Interrupt();
if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。
{
printf("ERROR\n");
return 0;
}
else
{
for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位
L.elem[j-1] = L.elem[j];
L.length = L.length-1;//表长减1
return 0;
}
}
顺序表的插入:
Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入 i:为要插入的表的位置。e:要插入该位置的元素
{
int j;
scanf("%d",&i);
scanf("%d",&e);
Interrupt();
if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围
{
printf("ERROR\n");
return 0;
}
else
{
for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;//将新元素e放入第i个位置
++L.length;//表长加1
return 0;
}
}
顺序表的查找(按位查找):
Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素
{
int j,i=0;
bool text=true;//利用bool类型,来判断表里有没有值为e的值
scanf("%d",&e);//输入e的值
Interrupt();
for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较,
{
if(L.elem[j]==e)
{
printf("第 %d 位\n",j+1);
i++;
text=false;
}
}
if(text)//bool类型的输出
printf("没有找到");
return 0;
}
最后附上 完整代码 , c语言顺序表 存储结构。主函数中为了方便操作增加了一些代码。
#include
#include
#include
#define MAXSIZE 100//顺序表所能表达的最大长度
#define OVERFLOW 1
typedef int Status;//重命名,使Status和int有相同的作用
typedef int ElemType;
void Interrupt(void)//创建一个中断函数
{
while(1) //用于检测换行符,使函数脱离scanf的连续输出
if(getchar()=='\n')
break;
}
typedef struct
{
ElemType *elem;//存储空间的基地址
int length;//当前长度
}Sqlist;//顺序表的结构类型为Sqlist
Status InitList(Sqlist &L)//建立一个空表
{
L.elem = new ElemType[MAXSIZE];
if(!L.length)
{
exit(OVERFLOW);
}
L.length = 0;
return 0;
}
Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表
{
int b,i=0;
printf("表的长度: ");
scanf("%d",&L.length);
Interrupt();
printf("输入要填入表的数字:\n");
for( ; i < L.length ; i++ )
{
scanf("%d",&b);
L.elem[i] = b;
}
Interrupt();
return 0;
}
Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来
{
int j;
if(L.length==0)
{
printf("空表\n");
return 0;
}
else
{
for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据
printf("%d ",L.elem[j]);
printf("\n");//最后换行
return 0;
}
}
Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数
{
scanf("%d",&i);
Interrupt();
if(i<0||i>L.length)//判断i的取值是否超范围
{
printf("ERROR\n");//如果超范围,返回ERROR,并结束
return 0;
}
else
{
e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出
printf("%d\n",e);
return 0;
}
}
Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置
{
int j;
scanf("%d",&i);//输入要删除的第i位
Interrupt();
if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。
{
printf("ERROR\n");
return 0;
}
else
{
for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位
L.elem[j-1] = L.elem[j];
L.length = L.length-1;//表长减1
return 0;
}
}
Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入 i:为要插入的表的位置。e:要插入该位置的元素
{
int j;
scanf("%d",&i);
scanf("%d",&e);
Interrupt();
if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围
{
printf("ERROR\n");
return 0;
}
else
{
for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;//将新元素e放入第i个位置
++L.length;//表长加1
return 0;
}
}
Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素
{
int j,i=0;
bool text=true;//利用bool类型,来判断表里有没有值为e的值
scanf("%d",&e);//输入e的值
Interrupt();
for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较,
{
if(L.elem[j]==e)
{
printf("第 %d 位\n",j+1);
i++;
text=false;
}
}
if(text)//bool类型的输出
printf("没有找到");
return 0;
}
int main()
{
int a,i=0;
char c;
Sqlist L;//将L定义为Sqlist类型的变量,便于直接引用
InitList(L);
MyList(L);
TraverseList(L);
printf("操作输入序号选择:\n 1:遍历顺序表\n 2:顺序表取值\n 3:删除元素\n 4:插入元素\n 5:顺序表查找\n 6:表长\n输入#退出\n");
while(1)
{
int f = 0;
printf("请选择:");
scanf("%c",&c);
Interrupt();
switch(c)
{
case '1': printf("遍历顺序表: ");TraverseList(L); break;
case '2': printf("顺序表取值(取值位置): ");GetElem(L, a , a ); break;
case '3': printf("删除元素(删除的位置): ");DeleteElem(L,a); break;
case '4': printf("插入元素(位置 插入的元素): ");ListInsert(L,a,a); break;
case '5': printf("顺序表查找(输入要查找的元素): ");LocateElem(L,a); break;
case '6': printf("表长: %d \n",L.length); break;
case '#': f = 1; break;
default: printf("ERROR\n");
}
if (f == 1)
{
printf("已正常退出!\n");
break;
}
}
return 0;
}
(完)