第一篇博客
线性表基本操作,暑假把大一的代码练习一遍。多多指教,谢谢
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
typedef struct{
int *base;
int length;
int listsize;
}SqList;
int InitSqlist(SqList &l)//初始化
{ l.base = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!l.base)exit(OVERFLOW);
l.listsize = LIST_INIT_SIZE;
l.length = 0;
return OK;
}
int BulidSqlist (SqList &l)
{ int i,n;
printf("请输入元素的个数\n");
scanf("%d",&n);
if(n>LIST_INIT_SIZE)
{
l.base = (int *)realloc(l.base,(n*10)*sizeof(int));
if(!l.base)exit(OVERFLOW);
l.listsize = n;
}
printf("请输入%d个元素的值\n",n);
for(i=0;i<n;i++)
scanf("%d",l.base+i);
l.length = n;
return OK;
}
void PrintSqlist(SqList &l)//输出元素以及表长
{
int i;
for(i=0;i<l.length;i++)
printf("第%d个元素为%d\n",i+1,*(l.base+i));
printf("表长为:%d\n",l.length);
}
void Tips()//提示函数
{
printf("\n请选择你的想要的操作:\n");
printf("<1> 输出顺序表及顺序表的长度\n");
printf("<2> 删除值为x的结点\n");
printf("<3> 删除给定位置i的结点\n");
printf("<4> 将顺序表逆置\n");
printf("<5> 将顺序表按升序排序\n");
printf("<6> 将x插入到顺序表的适当位置上\n");
printf("<7> 将两个有序表合并\n");
printf("<0> 退出\n\n");
}
int DeleteSqlist(SqList &l,int x)//删除值为X的元素
{
int i;
for(i=0;i<l.length;i++)
if(*(l.base+i) == x)
break;
if(i == l.length)
return ERROR;
for(i++;i<l.length;i++)
*(l.base+i-1) = *(l.base+i);
l.length--;
printf("删除后的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
return OK;
}
int DeleteSqlistIndex(SqList &l,int x)//删除指定位置的元素
{ int i;
if(x < 0 || x >= l.length)
return ERROR;
for(i=x+1;i<l.length;i++)
*(l.base+i-1) = *(l.base+i);
l.length--;
printf("删除后的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
return OK;
}
void Inverse(SqList &l)//逆置函数
{ int i,t;
for(i=0;i<l.length/2;i++)
{
t=*(l.base+i);
*(l.base+i) = *(l.base+l.length-i-1);
*(l.base+l.length-i-1) = t;
}
printf("逆置后的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
}
void SortSqlist(SqList &l)//冒泡
{ int i,j,t;
printf("排序前的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
for(i=1;i<l.length;i++)
for(j=0;j<l.length-i;j++)
{
if(*(l.base+j)>*(l.base+j+1))
{
t = *(l.base+j);
*(l.base+j) = *(l.base+j+1);
*(l.base+j+1) = t;
}
}
printf("排序后的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
}
int InserSqList(SqList &l,int x)//插入X(保持有序)
{ int i,tag;
printf("插入前的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
if(l.length >= l.listsize)
{
l.base = (int *)realloc(l.base,(10)*sizeof(int));
if(!l.base)
exit(OVERFLOW);
l.listsize += 10;
}
for(i=0;i<l.length;i++)
if(x < *(l.base+i)) break;
tag = i;
for(i=l.length;i>tag;i--)
*(l.base+i) = *(l.base+i-1);
*(l.base+tag) = x;
l.length++;
printf("插入后的Sqlist:\n");
for(i=0;i<l.length;i++)
printf("%d\n",*(l.base+i));
return OK;
}
int MergerSqlist(SqList &l,SqList &lb)//合并2个线性表
{
int i,j,k;
SqList lc;
InitSqlist(lc);
if(lc.listsize<l.length + lb.length)
{lc.base = (int *)realloc(lc.base,(l.length+lb.length+10)*sizeof(int));
if(!lc.base)
return ERROR;
lc.listsize = lc.listsize+l.length+lb.length+10;
}
i = j = k = 0;
while(i<l.length && j<lb.length)
{
if(*(l.base+i) < *(lb.base+j))
{
*(lc.base+k) = *(l.base+i);
k++,i++;
}
else
{
*(lc.base+k) = *(lb.base+j);
k++;j++;
}
}
while(i<l.length)
{
*(lc.base+k) = *(l.base+i);
i++;k++;
}
while(j<lb.length)
{
*(lc.base+k) = *(lb.base+j);
j++;k++;
}
lc.length = l.length + lb.length;
printf("合并后的Sqlist:\n");
for(i=0;i<lc.length;i++)
printf("%d\n",*(lc.base+i));
return OK;
}
int main()
{
int operate,x,tag;
SqList l,lb;
InitSqlist(l);
BulidSqlist(l);
Tips();
scanf("%d",&operate);
while(operate)
{
switch(operate)
{
case 1 : PrintSqlist(l);break;
case 2 : printf("请输入想要删除的元素\n");
scanf("%d",&x);
tag = DeleteSqlist(l,x);
if(tag)
printf("删除值为%d的元素成功\n",x);
else
printf("删除值为%d的元素失败\n",x);
break;
case 3 : printf("请输入要删除的位置\n");
scanf("%d",&x);
tag = DeleteSqlistIndex(l,x-1);
if(tag)printf("删除位置为%d的元素成功\n",x);
else printf("删除位置为%d的元素失败\n",x);
break;
case 4 : Inverse(l);
break;
case 5 : SortSqlist(l);
break;
case 6 : printf("请输入要插入的数据:\n");
scanf("%d",&x);
tag = InserSqList(l,x);
if(tag)printf("插入值为%d的元素成功\n",x);
else printf("插入值为%d的元素失败\n",x);
break;
case 7 : printf("请输入Lb的内容\n");
InitSqlist(lb);
BulidSqlist(lb);
tag = MergerSqlist(l,lb);
if(tag)printf("合并成功\n",x);
else printf("合并失败\n",x);
break;
}
Tips();
scanf("%d",&operate);
}
return 0;
}