C语言线性顺序表的插入和删除
实现七个函数:1)置空表:voidsetnull(structList*p)2)求长度:intlength(structList*p)3)取表中第i个结点:ETget(s...
实现七个函数:
1)置空表:void setnull(struct List *p)
2) 求长度:int length(struct List *p)
3)取表中第i个结点:ET get (struct List *p,int i)
4)按值查找:int locate(struct List *p,ET x)
5)插入结点:void insert(struct List *p,int i,ET x)
6)删除结点:void delete(struct List *p,int i)
7)显示链表:void display(struct List *p)
在屏幕上显示如下内容:(就是说,每个动作都应该在屏幕上有提示)
我的顺序表为:d-> e->a->c->a->b
值为a在表中的位置为:3
位置4的值为:c
删除第二个结点后顺序表:d-> a->c->a->b
删除第二个结点后顺序表:d-> c->a->b
删除第1个结点后顺序表: c->a->b
删除第1个结点后顺序表: a->b 展开
1)置空表:void setnull(struct List *p)
2) 求长度:int length(struct List *p)
3)取表中第i个结点:ET get (struct List *p,int i)
4)按值查找:int locate(struct List *p,ET x)
5)插入结点:void insert(struct List *p,int i,ET x)
6)删除结点:void delete(struct List *p,int i)
7)显示链表:void display(struct List *p)
在屏幕上显示如下内容:(就是说,每个动作都应该在屏幕上有提示)
我的顺序表为:d-> e->a->c->a->b
值为a在表中的位置为:3
位置4的值为:c
删除第二个结点后顺序表:d-> a->c->a->b
删除第二个结点后顺序表:d-> c->a->b
删除第1个结点后顺序表: c->a->b
删除第1个结点后顺序表: a->b 展开
展开全部
#include"stdio.h"
#include"malloc.h"
#include"iostream.h"
typedef int status;
typedef int elementype;
#define INITSIZE 100
#define INCREMENT 2
struct sqlist
{
elementype *elem;
int length;
int listsize;
};
//建立链表,并排列数据
status listinit(sqlist &l)
{
int i=0,x,j,t;
l.elem=(elementype *)malloc(INITSIZE*sizeof(elementype));
if(!l.elem)
{
cout<<"建表失败"<<endl;
return 0;
}
l.length=0;
l.listsize=INITSIZE;
while(1)
{
cout<<"请输入数据(输入0时结束):";
cin>>x;
if(x==0) break;
l.elem[i]=x;
++l.length;
i++;
}
for(i=0;i<l.length-1;i++)
for(j=0;j<l.length-i-1;j++)
if(l.elem[j]>l.elem[j+1])
{
t=l.elem[j+1];
l.elem[j+1]=l.elem[j];
l.elem[j]=t;
}
cout<<"排序成功"<<endl;
return 1;
}
//插入数据
status listinsert(sqlist &l,int i,elementype e)
{
elementype *p,*q,*newbase;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
if(l.length>=l.listsize)
{
newbase=(elementype*)realloc(l.elem,(l.listsize+INCREMENT)*sizeof(elementype));
if(!newbase)
{
cout<<"申请空间失败"<<endl;
return 0;
}
l.elem=newbase;
l.listsize=l.listsize+INCREMENT;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++l.length;
cout<<"插入成功";
return 1;
}
//删除数据
status listdelete(sqlist &l,int i,elementype &e)
{
elementype *p,*q;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
p=&(l.elem[i-1]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
cout<<"删除成功"<<endl;
free(&e);
return 1;
}
//删除重复的数据
status listdeleterepeat(sqlist &l)
{
int i,j;
elementype *p,*q,e;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length-1;j++)
if(l.elem[i]==l.elem[j])
{
p=&(l.elem[j]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
free(&e);
j--;
}
return 1;
}
//输出顺序表数据
status displaylist(sqlist &l)
{
int i;
cout<<"顺序表的数据为:"<<endl;
for(i=0;i<l.length;i++)
{
cout<<l.elem[i]<<" ";
}
cout<<endl;
return 1;
}
//查找数据
status locatelem(sqlist &l,int x)
{
elementype *p;
int i=1;
p=l.elem;
while(i<l.length&&(*p++)!=x)
i++;
cout<<i<<endl;
return 1;
}
//清空列表
void listclear(sqlist &l)
{
l.length=0;
}
//销毁顺序表
void listdestroy(sqlist &l)
{
if(l.elem)
free(l.elem);
}
//求顺序表长度
status listlength(sqlist &l)
{
cout<<"顺序表的长度为:"<<l.length<<endl;
return 1;
}
int main()
{
sqlist l;
int a,i,x;
elementype e;
cout<<"*************************************************"<<endl;
cout<<"* 顺序表的表示和实现 *"<<endl;
cout<<"*************************************************"<<endl;
do{
cout<<"*************************************************"<<endl;
cout<<"* 菜单 *"<<endl;
cout<<"* 1.建立顺序表 *"<<endl;
cout<<"* 2.插入数据 *"<<endl;
cout<<"* 3.删除数据 *"<<endl;
cout<<"* 4.删除重复数据 *"<<endl;
cout<<"* 5.清空数据 *"<<endl;
cout<<"* 6.查找数据 *"<<endl;
cout<<"* 7.顺序表的长度 *"<<endl;
cout<<"* 8.显示顺序表 *"<<endl;
cout<<"* 0.退出顺序表 *"<<endl;
cout<<"*************************************************"<<endl;
cout<<"输入你的选择:";
cin>>a;
switch(a)
{
case 1: listinit(l);
displaylist(l);
break;
case 2: cout<<"请输入要插入数据的位置:";
cin>>i;
cout<<"请输入要插入的数据元素:";
cin>>e;
listinsert(l,i,e);
displaylist(l);
break;
case 3: cout<<"请输入要删除的数据的位置:";
cin>>i;
listdelete(l,i,e);
displaylist(l);
break;
case 4: cout<<"删除前的数据为:";
displaylist(l);
listdeleterepeat(l);
cout<<"删除后的数据为:";
displaylist(l);
break;
case 5: cout<<"清空前为:";
displaylist(l);
cout<<"清空后为:";
listclear(l);
displaylist(l);
break;
case 6: cout<<"输入你要查找的数据:";
cin>>x;
cout<<"你要查找的数据的位置为:";
locatelem(l,x);
displaylist(l);
break;
case 7: cout<<"顺序表的长度为:";
listlength(l);
break;
case 8: displaylist(l);
break;
default: break;
}
}while(a!=0);
return 1;
}
#include"malloc.h"
#include"iostream.h"
typedef int status;
typedef int elementype;
#define INITSIZE 100
#define INCREMENT 2
struct sqlist
{
elementype *elem;
int length;
int listsize;
};
//建立链表,并排列数据
status listinit(sqlist &l)
{
int i=0,x,j,t;
l.elem=(elementype *)malloc(INITSIZE*sizeof(elementype));
if(!l.elem)
{
cout<<"建表失败"<<endl;
return 0;
}
l.length=0;
l.listsize=INITSIZE;
while(1)
{
cout<<"请输入数据(输入0时结束):";
cin>>x;
if(x==0) break;
l.elem[i]=x;
++l.length;
i++;
}
for(i=0;i<l.length-1;i++)
for(j=0;j<l.length-i-1;j++)
if(l.elem[j]>l.elem[j+1])
{
t=l.elem[j+1];
l.elem[j+1]=l.elem[j];
l.elem[j]=t;
}
cout<<"排序成功"<<endl;
return 1;
}
//插入数据
status listinsert(sqlist &l,int i,elementype e)
{
elementype *p,*q,*newbase;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
if(l.length>=l.listsize)
{
newbase=(elementype*)realloc(l.elem,(l.listsize+INCREMENT)*sizeof(elementype));
if(!newbase)
{
cout<<"申请空间失败"<<endl;
return 0;
}
l.elem=newbase;
l.listsize=l.listsize+INCREMENT;
}
q=&(l.elem[i-1]);
for(p=&(l.elem[l.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++l.length;
cout<<"插入成功";
return 1;
}
//删除数据
status listdelete(sqlist &l,int i,elementype &e)
{
elementype *p,*q;
if(i<1||i>l.length)
{
cout<<"i输入错误"<<endl;
return 0;
}
p=&(l.elem[i-1]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
cout<<"删除成功"<<endl;
free(&e);
return 1;
}
//删除重复的数据
status listdeleterepeat(sqlist &l)
{
int i,j;
elementype *p,*q,e;
for(i=0;i<l.length-1;i++)
for(j=i+1;j<l.length-1;j++)
if(l.elem[i]==l.elem[j])
{
p=&(l.elem[j]);
e=*p;
q=l.elem+l.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--l.length;
free(&e);
j--;
}
return 1;
}
//输出顺序表数据
status displaylist(sqlist &l)
{
int i;
cout<<"顺序表的数据为:"<<endl;
for(i=0;i<l.length;i++)
{
cout<<l.elem[i]<<" ";
}
cout<<endl;
return 1;
}
//查找数据
status locatelem(sqlist &l,int x)
{
elementype *p;
int i=1;
p=l.elem;
while(i<l.length&&(*p++)!=x)
i++;
cout<<i<<endl;
return 1;
}
//清空列表
void listclear(sqlist &l)
{
l.length=0;
}
//销毁顺序表
void listdestroy(sqlist &l)
{
if(l.elem)
free(l.elem);
}
//求顺序表长度
status listlength(sqlist &l)
{
cout<<"顺序表的长度为:"<<l.length<<endl;
return 1;
}
int main()
{
sqlist l;
int a,i,x;
elementype e;
cout<<"*************************************************"<<endl;
cout<<"* 顺序表的表示和实现 *"<<endl;
cout<<"*************************************************"<<endl;
do{
cout<<"*************************************************"<<endl;
cout<<"* 菜单 *"<<endl;
cout<<"* 1.建立顺序表 *"<<endl;
cout<<"* 2.插入数据 *"<<endl;
cout<<"* 3.删除数据 *"<<endl;
cout<<"* 4.删除重复数据 *"<<endl;
cout<<"* 5.清空数据 *"<<endl;
cout<<"* 6.查找数据 *"<<endl;
cout<<"* 7.顺序表的长度 *"<<endl;
cout<<"* 8.显示顺序表 *"<<endl;
cout<<"* 0.退出顺序表 *"<<endl;
cout<<"*************************************************"<<endl;
cout<<"输入你的选择:";
cin>>a;
switch(a)
{
case 1: listinit(l);
displaylist(l);
break;
case 2: cout<<"请输入要插入数据的位置:";
cin>>i;
cout<<"请输入要插入的数据元素:";
cin>>e;
listinsert(l,i,e);
displaylist(l);
break;
case 3: cout<<"请输入要删除的数据的位置:";
cin>>i;
listdelete(l,i,e);
displaylist(l);
break;
case 4: cout<<"删除前的数据为:";
displaylist(l);
listdeleterepeat(l);
cout<<"删除后的数据为:";
displaylist(l);
break;
case 5: cout<<"清空前为:";
displaylist(l);
cout<<"清空后为:";
listclear(l);
displaylist(l);
break;
case 6: cout<<"输入你要查找的数据:";
cin>>x;
cout<<"你要查找的数据的位置为:";
locatelem(l,x);
displaylist(l);
break;
case 7: cout<<"顺序表的长度为:";
listlength(l);
break;
case 8: displaylist(l);
break;
default: break;
}
}while(a!=0);
return 1;
}
追问
写的不错!不过,我还没学C++。最好用C语言线性顺序表来实现,因为这个是用来练习线性顺序表的,而不是追求最优代码。
追答
你把cout和cin函数那部分换成printf和scanf函数就行了;
不过这两个函数cout和cin函数很好用啊,方便
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询