学习线性表顺序存储之后,在使用C语言具体实现后,发现一些问题,现总结如下:
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 20
typedef int elemtype;
typedef int status;
//建线性表
typedef struct
{
elemtype data[maxsize];
int length;
} sqlist;
//初始化线性表
status initlist(sqlist *l)
{
l->length=0;
return OK;
}
status visit(elemtype c)
{
printf("%d ",c);
return OK;
}
//将元素e插入线性表第i个位置
status insertlist(sqlist *l,elemtype e,int i)
{
/*int k;
if(l->length==maxsize)
return ERROR;
if(i<1||i>l->length+1)
return ERROR;
if(k<=l->length)
{
for(k=l->length-1;k>=i-1;k--)
l->data[k+1]=l->data[k];
}
l->data[i-1]=e;
l->length++;
return OK;*/
int k;
if(i<1||i>l->length+1){
return ERROR;
}
for(k=l->length-1;k>=i-1;k--){
l->data[k+1]=l->data[k];
}
l->data[i-1]=e;
l->length++;
return OK;
}
//遍历线性表
status traverselist(sqlist l)
{
int i;
for(i=0;i<l.length;i++)
visit(l.data[i]);
return OK;
}
//线性表长度
status listlength(sqlist *l)
{
return l->length;
}
//判断l是否为空
status listempty(sqlist *l)
{
if(l->length==0)
return TRUE;
else
return FALSE;
}
//清空线性表
status listclear(sqlist *l)
{
l->length=0;
return OK;
}
//用e返回线性表中第i位的元素
status getelem(sqlist *l,int i)
{
elemtype e=l->data[i-1];
return e;
}
//删除线性表中第i个元素
status deleteelem(sqlist *l,int i)
{
elemtype e;
e=l->data[i-1];
int k;
if(i<1||i>l->length)
return ERROR;
if(i<l->length)
{
for(k=i;k<l->length;k++)//注意循环条件
l->data[k-1]=l->data[k];
}
l->length--;
return e;
}
//判断某元素e是否存在于线性表中
status locatelist(sqlist *l,elemtype e)
{
for(int k=0;k<l->length;k++)
{
if(e==l->data[k])
break;
}
return FALSE;
}
//合并两线性表
status unionl(sqlist *la,sqlist *lb)
{
int lenlb=listlength(lb),lenla=listlength(la);
elemtype e;
for(int k=1;k<lenlb;k++)
{
e=getelem(lb,k);//从头到尾遍历lb取出每一个元素
if(!locatelist(la,e))//如果e不在线表la中
insertlist(la,e,lenla++);//则将e插入la,la表长增加一个单位
}
}
int main(void)
{
sqlist l,lb;
int k;
initlist(&l);
printf("初始化后,l.length=%d\n",l.length);
for(k=1;k<=5;k++)
{
insertlist(&l,k,1);
}
printf("在表头插入1~5后,l.data=");
traverselist(l);
putchar('\n');
k=listlength(&l);
printf("l.length=%d",l.length);
k=listempty(&l);
printf("l是否为空:i=%d(1是 0否)\n",k);
listclear(&l);
printf("清空l后,l.length=%d\n",l.length);
k=listempty(&l);
printf("l是否为空:i=%d(1是 0否)",k);
printf("在表头插入1~10后,l.data=");
for(k=1;k<=10;k++)
{
insertlist(&l,k,k);//在表尾插只需让插入位置和插入数值保持相等
}
traverselist(l);
putchar('\n');
printf("在表头插入0后,l.data=");
insertlist(&l,0,1);
traverselist(l);
putchar('\n');
k=getelem(&l,5);
printf("第五个的值为:%d\n",k);
for(k=4;k<=5;k++)
{
int j=getelem(&l,k);
printf("第%d个元素的值为%d\n",k,j);
}
int len=listlength(&l);
printf("l.length=%d\n",len);
status j;
for(k=12;k>=11;k--)
{
j=deleteelem(&l,k);
if(j==ERROR)
printf("删除第%d个元素失败\n",k);
else
printf("删除第%d个元素的值为%d\n",k,j);
}
printf("依次输出l的元素:");
traverselist(l);
putchar('\n');
elemtype e=deleteelem(&l,5);
printf("删除第5个元素的值为%d\n",e);
printf("依次输出l的元素:");
traverselist(l);
putchar('\n');
printf("依次输出合并了lb和l的元素:");
for(int k=9;k<=15;k++)
{
insertlist(&lb,k,1);
}
//traverselist(lb);
unionl(&l,&lb);
traverselist(l);
}