之前写的那个有点小问题,
-
未在初始化之前判断线性表是否存在
-
未在选择后判断线性表是否为空
-
甚至我那个合并线性表都有错
-
在自定义函数里面有输入输出语句(此次把它移到主函数里面了)
果然,我还是个弟弟,写的问题还是多多的,不过不急,慢慢琢磨,等大佬们挑出我的问题再次改正。
下面准备重写链表、栈、串、数组、广义表什么的
星期天准备看一本渗透流程,看完发出来。
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define status int
#define ElemType int
#define ERROR 0
#define OK 1
#define SECONDERROR 2
typedef struct{
ElemType *elem;
int length;
int listsize;
}Sqlist;
void menu();
status judgement(Sqlist );
status initlist(Sqlist &); //初始化一个线性表
status deletelist(Sqlist &); //销毁线性 表
status clearlist(Sqlist &P); //清空线性表
status emptylist(Sqlist &P); //判断是否为空
status lengthlist(Sqlist &P); //线性表长度
status getlist(Sqlist P,int ,int&); //取特定位置元素
status locallist(Sqlist P,int ,int &); //判断元素在线性表中的位置
status priorlist(Sqlist P,int ,int &); //求前驱
status nextlist(Sqlist P,int ,int &); //求后继
status insertlist(Sqlist &,int ,int ); //插入
status deletenumlist(Sqlist &,int); //删除指定位置元素
void viewlist(Sqlist ); //输出元素
void sumlist(Sqlist ,Sqlist ,Sqlist &);//合并线性表
int main()
{
Sqlist L;
L.elem=NULL;
int select,m,n;
while(1)
{
menu();
printf("请输入你的选择:");
scanf("%d",&select);
if(select<1||select>14)
{ printf("超出范围!"); break;}
switch(select)
{
case 1:
if(initlist(L)) printf("创建成功!\n");
else printf("创建失败!\n");
break;
case 2:
if(judgement(L))
{
if(deletelist(L))
printf("销毁成功!\n");
break;
}
printf("未创建顺序表!\n");
break;
case 3:
if(judgement(L))
{
if(clearlist(L))
printf("重置成功!\n");
break;
}
printf("未创建顺序表!\n");
break;
case 4:
if(judgement(L))
{
if(lengthlist(L))
{
printf("线性表不为空!\n");
break;
}
printf("线性表为空!\n");
break;
}
printf("未创建顺序表!\n");
break;
case 5:
if(judgement(L))
{
printf("线性表长度为:%d!\n",lengthlist(L));
break;
}
printf("未创建顺序表!\n");
break;
case 6:
if(judgement(L))
{
if(lengthlist(L))
{
printf("请输入你要查询数据的位置:\n");
scanf("%d",&m);
if(m<0||m>lengthlist(L))
{
printf("查询位置超出长度。\n");
break;
}
if(getlist(L,m,n)==0)
{
printf("线性表中无此元素。\n");
break;
}
else
{
printf("此元素为%d。\n",n);
break;
}
}
printf("此为空线性表。\n");
break;
}
printf("未创建线性表!\n");
break;
case 7:
if(judgement(L))
{
if(lengthlist(L))
{
printf("请输入你要查询的数字:\n");
scanf("%d",&m);
if(locallist(L,m,n)==0)
{
printf("线性表中无此元素。\n");
break;
}
else
{
printf("此元素的位置为%d。\n",n);
break;
}
}
printf("此为空线性表。\n");
break;
}
printf("未创建线性表!\n");
break;
case 8:
if(judgement(L))
{
if(lengthlist(L))
{
printf("请输入你要查询前驱的位置:\n");
scanf("%d",&m);
if(m<0||m>lengthlist(L))
{
printf("查询位置超出范围。\n",n);
break;
}
else
{
if(m==1)
{
printf("此元素无前驱。\n");
break;
}
priorlist(L,m,n);
printf("前驱为:%d。\n",n);
break;
}
}
printf("此为空线性表。\n");
break;
}
printf("未创建线性表!\n");
break;
case 9:
if(judgement(L))
{
if(lengthlist(L))
{
printf("请输入你要查询后继的位置:\n");
scanf("%d",&m);
if(m<0||m>lengthlist(L))
{
printf("查询位置超出范围。\n",n);
break;
}
else
{
if(m==lengthlist(L))
{
printf("此元素无后继。\n");
break;
}
priorlist(L,m,n);
printf("后继为:%d。\n",n);
break;
}
}
printf("此为空线性表。\n");
break;
}
printf("未创建线性表!\n");
break;
case 10:
if(judgement(L))
{
printf("请输入插入数字,位置:\n");
scanf("%d %d",&m,&n);
if(insertlist(L,m,n)==0)
{
printf("插入位置超出范围!\n");
break;
}
else if(insertlist(L,m,n)==2)
{
printf("未成功创建新的线性表!\n");
break;
}
else if(insertlist(L,m,n)==1)
{
printf("插入完成!\n");
break;
}
}
printf("未创建线性表!\n");
break;
case 11:
if(judgement(L))
{
if(lengthlist(L))
{
printf("请输入你想删除的位置:");
scanf("%d",m);
if(deletenumlist(L,m))
{
printf("删除完成!\n");
break;
}
else
{
printf("删除位置超出范围!\n");
break;
}
}
printf("此为空线性表!\n");
break;
}
printf("未创建线性表!\n");
break;
case 12:
if(judgement(L))
{
if(lengthlist(L))
{
viewlist(L);
break;
}
printf("此为空线性表!\n");
break;
}
printf("未创建线性表!\n");
break;
case 13:
Sqlist La;Sqlist Lb;Sqlist L;
La.elem=(ElemType *)malloc(4*sizeof(ElemType));
La.length=0;
La.listsize=4;
Lb.elem=(ElemType *)malloc(4*sizeof(ElemType));
La.length=0;
Lb.listsize=4;
L.elem=(ElemType *)malloc(8*sizeof(ElemType));
L.length=8;
L.listsize=8;
printf("输入la的4个元素:\n");
for(int i=0;i<4;i++)
{
scanf("%d",&La.elem[i]);
}
La.length=4;
printf("输入lb的4个元素:\n");
for(int j=0;j<4;j++)
{
scanf("%d",&Lb.elem[j]);
}
Lb.length=4;
sumlist(La,Lb,L);
break;
case 14:
return 0;
}
}
}
void menu()
{
printf("\n");
printf("1-----初始化一个线性表\n");
printf("2-----销毁线性表\n");
printf("3-----清空线性表\n");
printf("4-----判断线性表是否为空\n");
printf("5-----求线性表长度\n");
printf("6-----获取线性表中指定位置元素\n");
printf("7-----获取线性表元素的位置\n");
printf("8-----求前驱\n");
printf("9-----求后继\n");
printf("10-----线 性表指定位置插入元素\n");
printf("11-----删除线性表指定位置元素\n");
printf("12-----显示线性表\n");
printf("13-----合并两个非递减有序的线性表\n");
printf("14-----退出,输入一个负数\n");
}
status judgement(Sqlist P) //判断选择之前是否有初始化线性表
{
if(!P.elem) return ERROR;
else return OK;
}
status initlist(Sqlist &P) //初始化一个线性表
{
P.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
if(!P.elem) return ERROR;
P.length=0;
P.listsize=LIST_INIT_SIZE;
return OK;
}
status deletelist(Sqlist &P) //销毁线性表
{
free(P.elem);
P.length=0;
P.listsize=0;
P.elem=NULL;
return OK;
}
status clearlist(Sqlist &P) //清空线性表
{
P.length=0;
return OK;
}
status emptylist(Sqlist &P) //判断是否为空
{
if(P.length==0)
return OK;
else return ERROR;
}
status lengthlist(Sqlist &P) //求长度
{
return P.length;
}
status getlist(Sqlist P,int m,int &n) //获取指定位置元素
{
n=P.elem[m-1];
return OK;
}
status locallist(Sqlist P,int m,int &n) // 求线性表是否有m n用来返回所在位置
{
for(int i=0;i<P.length;i++)
{
if(P.elem[i]==m)
{
n=i;
return OK;
}
}
return ERROR;
}
status priorlist(Sqlist P,int m,int &n) // 求m的前驱。 n用来返回元素
{
n=P.elem[m-2];
return OK;
}
status nextlist(Sqlist P,int m,int & n) // 求m的后继。 n用来返回元素
{
n=P.elem[m];
return OK;
}
status insertlist(Sqlist &P,int m,int n) //插入元素
{
if(n<0||n>lengthlist(P)+1) //判断插入位置是否超出长度
return ERROR;
if(P.length<P.listsize) //空间不够重新分配更大的空间
{
P.elem=(ElemType *)realloc(P.elem,(LISTINCREMENT+LIST_INIT_SIZE)*sizeof(ElemType));
if(!P.elem) return SECONDERROR;
P.listsize+=LISTINCREMENT;
}
for(int i=lengthlist(P);i>n-1;i--) //插入位后面的元素后移一位
{
P.elem[i]=P.elem[i-1];
}
P.elem[n-1]=m;
P.length+=1;
return OK;
}
status deletenumlist(Sqlist &P,int m) //删除元素
{
if(m<0||m>lengthlist(P)-1)
return ERROR;
for(int i=m;i<lengthlist(P);i++)//插入位后面的元素前移一位
{
P.elem[i-1]=P.elem[i];
}
P.length-=1;
return OK;
}
void viewlist(Sqlist P) //输出线性表
{
for(int i=0;i<lengthlist(P);i++)
{
printf("%d\t",P.elem[i]);
}
}
void sumlist(Sqlist la,Sqlist lb,Sqlist &lc) //合并线性表
{
int i;int j;
for(i=0;i<lengthlist(la);i++)
{
lc.elem[i]=la.elem[i];
}
for(i=la.length,j=0;j<lb.length;i++,j++)
{
lc.elem[i]=lb.elem[j];
}
printf("合并线性表成功.");
viewlist(lc);
}