=x)
i++;
if(i>=L.length)
return0;
else
return(i+1);
}
/*向顺序表第i个元素前插入元素x,插入成功返回1,不成功返回0*/
intInsert_List(PSeqListPL,inti,ElemTypex)
{
intj;
if(!
PL)
{
printf("顺序表不存在!
");
return0;
}
if(i<1||i>PL->length+1)
{printf("插入位置不正确!
\n");
return0;
}
for(j=PL->length-1;j>=i-1;j--)
PL->data[j+1]=PL->data[j];
PL->data[i-1]=x;
PL->length++;
return1;
}
/*在线性表中插入元素x,使得线性表仍然有序*/
intinsert(PSeqListPL,ElemTypex)
{
inti,j;
i=PL->length-1;
while(xdata[i])
i--;
for(j=PL->length-1;j>i;j--)
PL->data[j+1]=PL->data[j];
PL->data[i+1]=x;
PL->length++;
return1;
}
/*删除线性表中第i个元素,成功删除元素,返回1,否则返回0*/
intDelete_List(PSeqListPL,inti)
{
intj;
if(!
PL)
{
printf("顺序表不存在!
");
return0;
}
if(i<1||i>PL->length)
{printf("删除位置不正确!
\n");
return0;
}
for(j=i;j<=PL->length-1;j++)
PL->data[j-1]=PL->data[j];
PL->length--;
return1;
}
/*删除线性表中从第i个元素起k个元素*/
intdelk(PSeqListL,inti,intk)
{
intj;
if(i<0||i+k-1>L->length)
{
printf("error!
");
return0;
}
else
{
for(j=i+k-1;jlength;j++)
L->data[j-k]=L->data[j];
L->length=L->length-k;
return1;
}
}
/*向顺序表中顺序输入元素*/
voidCreat_List(PSeqListPL)
{inti;
printf("输入数据不得超过50个!
\n");
printf("输入顺序表中元素个数:
\n");
scanf("%d",&PL->length);
for(i=1;i<=PL->length;i++)
{printf("inputthe%dnumber:
",i);
scanf("%d",&PL->data[i-1]);
}
}
/*显示选择提示信息函数*/
voidShowSelect()
{printf("\n请选择要执行的操作:
\n");
printf("-------------------------\n");
printf("1----初始化\n");
printf("2----为顺序表输入元素\n");
printf("3----求顺序表长度\n");
printf("4----遍历输出顺序表\n");
printf("5----在顺序表中检索查找\n");
printf("6----向顺序表中插入元素\n");
printf("7----从顺序表中删除元素\n");
printf("0----退出\n");
printf("-------------------------\n");
printf("pleaseinputnumber0~~7\n\n");
}
intmain(void)
{PSeqListPL=NULL;
inti,x,flag;
intlen;/*表示顺序表长*/
intselect;/*select变量表示用户的选择项*/
ShowSelect();
scanf("%d",&select);
while(select!
=0)
{switch(select)
{case1:
PL=Init_SeqList();break;
case2:
Creat_List(PL);break;
case3:
len=Length_List(*PL);printf("顺序表长为%d\n",len);break;
case4:
Disp_List(*PL);break;
case5:
printf("\n请输入你想查找的数据:
");
scanf("%d",&x);
flag=Locate_List(*PL,x);
if(flag)
printf("该元素在顺序表中的位置是:
%d\n",flag);
else
printf("该元素在顺序表中不存在");
break;
case6:
printf("请输入要插入的元素的值和位置,用空格分隔:
\n");
scanf("%d%d",&x,&i);
flag=Insert_List(PL,i,x);
if(flag)printf("插入操作成功");
break;
case7:
printf("请输入要删除的元素的位置:
\n");
scanf("%d",&i);
flag=Delete_List(PL,i);
if(flag)printf("删除操作成功");
break;
}
ShowSelect();
scanf("%d",&select);
}
}
实验二链表的基本操作
实验目的:
1.进一步熟悉C语言上机环境,进一步掌握C语言结构特点
2.掌握单链表的逻辑结构和定义
3.掌握单链表的生成、插入、删除和查找等基本运算
实验要求:
1.完成算法设计和程序设计,并上机调试通过
2.完成实验报告,提供实验数据和结果
3.对插入和删除算法进行时间复杂度的估算
实验内容:
实现单链表的基本操作,使得对于线性表(6,9,14,23,28,50),实现以下功能:
1.从键盘依次往顺序表中输入数据
2.在第3位插入数值10,输出顺序表
3.删除第4位数值,输出整个顺序表.
4.查找表中是否有数据24,有则返回其位置
5.输出线性表中第i个元素的值,位序i由用户通过键盘输入
请在实验中完成以下函数定义并调用它们:
LinkListInit_LinkList()//初始化单链表
voidCreat_List(LinkListL,intn)//按逆序产生一个链表长度为n
intLength_List(LinkListL)//求单链表表长
voidDisp_List(LinkListL)//依次输出单链表中元素
//在单链表中检索查找x,找不到返回0,否则返回在线性表中的位序
intLocate_List(LinkListL,ElemTypex)
//向表中第i个元素前插入新元素x
intInsert_List(LinkListL,inti,ElemTypex)
//删除单链表中第i个元素
intDelete_List(LinkListL,inti)
//实现单链表的逆置
voidReverse_LinkList(LinkListL)
用户界面如图:
实验小结及思考:
1.总结单链表结构特点
2.试编写算法,在一个带头结点的单链表中删除最小值结点
参考代码
/*单链表结构定义各书差不多,只名称有区别,本程序名称定义按秦峰版*/
/*本程序为带头结点单链表*/
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineNull0
typedefintElemType;
typedefstructLNode
{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
/*初始化单链表,即产生一个带头结点的空表,创建成功则返回空表的头指针*/
LinkListInit_List(void)
{
LinkListL;
L=(LinkList)malloc(sizeof(LNode));
if(L)
L->next=NULL;//产生空表,头结点的next域为空
returnL;
}
/*按逆序产生一个长度为n链表,参数为初始化的空链表,及线性表长度n*/
/*每个元素依次插入在头结点后*/
intCreate_List(LinkListL,intn)
{inti;
LinkLists;/*s变量用于保存新结点地址*/
printf("生成有%d个元素的线性表:
\n",n);
for(i=n;i>0;i--)
{printf("请输入线性表中第%d个元素:
\n",i);/*逆序输入元素*/
s=(LinkList)malloc(sizeof(LNode));
if(!
s)
{
printf("创建结点不成功\n");
return0;
}
scanf("%d",&s->data);
s->next=L->next;
L->next=s;
}
return1;
}
/*求单链表表长,返回L中数据元素个数*/
intLength_List(LinkListL)
{
inti=0;
LinkListp=L->next;
while(p)
{
i++;
p=p->next;
}
returni;
}
/*当按位置查找元素,第i个元素存在时,其值赋给e并返回1,否则返回0*/
intGetElem_List(LinkListL,inti,ElemType*e)
{
intj=0;
LinkListp=L;
while(p&&j
{
p=p->next;
j++;
}
if(!
p||j>i)
{printf("链表不存在或参数i错");
return0;
}
*e=p->data;/*取第i个元素*/
return1;
}
/*按元素查找,查找链表中是否存在值为e的元素,存在,则返回L中第一个e元素的位序,若不存在,则返回值为0*/
intLocate_List(LinkListL,ElemTypee)
{
inti=0;
LinkListp=L;
while(p&&p->data!
=e)
{p=p->next;
i++;
}
if(p)
returni;
else
return0;
}
/*在带头结点的单链线性表L中第i个位置之前插入元素e*/
intInsert_List(LinkListL,inti,ElemTypee)
{
intj=0;
LinkListp=L,s;
while(p&&j{
p=p->next;
j++;
}
if(!
p||j>i-1)
returnERROR;
s=(LinkList)malloc(sizeof(structLNode));
s->data=e;
s->next=p->next;
p->next=s;
returnOK;
}
intDelete_List(LinkListL,inti,ElemType*e)/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/
{
intj=0;
LinkListp=L,q;
while(p->next&&j{
p=p->next;
j++;
}
if(!
p->next||j>i-1)
return0;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return1;
}
intDisp_List(LinkListL)/*显示单链表*/
{
LinkListp=L->next;
if(p==Null)printf("单链表为空表");
else
{printf("输出单链表:
\n");
while(p!
=Null)
{printf("%d",p->data);
printf("->");
p=p->next;
}
}
printf("\n");
return1;
}
/*以下函数为作业中常见练习,不是基本操作,也未在主函数中调用*/
/*删除单链表中多余的元素值相同的结点*/
voidDelRepeat_List(LinkListL)
{
LinkListp,h,pre;
h=L->next;
if(h==NULL)
{
printf("是一个空表");
return;
}
p=L->next->next;
if(p==NULL)
{
printf("表中只有一个结点");
return;
}
while(h->next!
=NULL)
{pre=h;
p=pre->next;
while(p)
{if(h->data==p->data)
{
pre->next=p->next;
free(p);
p=pre->next;
}
else
{
pre=p;
p=p->next;
}
}
h=h->next;
}
}
/*显示选择提示信息函数*/
voidShowSelect()
{printf("\n请选择要执行的操作:
\n");
printf("-------------------------\n");
printf("1----初始化\n");
printf("2----逆序输入元素\n");
printf("3----求单链表长度\n");
printf("4----遍历输出顺序表\n");
printf("5----在单链表中检索查找\n");
printf("6----向单链表中插入元素\n");
printf("7----从单链表中删除元素\n");
printf("0----退出\n");
printf("-------------------------\n");
printf("pleaseinputnumber0~~7\n\n");
}
intmain(void)
{LinkListPL=NULL;
inti,x,flag;
intlen;/*表示单链表长*/
intselect;/*select变量表示用户的选择项*/
ShowSelect();
scanf("%d",&select);
while(select!
=0)
{switch(select)
{case1:
PL=Init_List();break;
case2:
printf("请输入线性表中元素个数:
\n");scanf("%d",&len);Create_List(PL,len);break;
case3:
len=Length_List(PL);printf("单链表表长为%d\n",len);break;
case4:
Disp_List(PL);break;
case5:
printf("\n请输入你想查找的数据:
");
scanf("%d",&x);
i=Locate_List(PL,x);
if(flag)
printf("该元素在顺序表中的位置是:
%d\n",i);
else
printf("该元素在顺序表中不存在");
break;
case6:
printf("请输入要插入的元素的值和位置,用空格分隔:
\n");
scanf("%d%d",&x,&i);
flag=Insert_List(PL,i,x);
if(flag)printf("插入操作成功");
break;
case7:
printf("请输入要删除的元素的位置:
\n");
scanf("%d",&i);
flag=Delete_List(PL,i,&x);
if(flag)printf("删除操作成功");
break;
case8:
DelRepeat_List(PL);
}
ShowSelect();
scanf("%d",&select);
}
}
实验三线性表的应用----稀疏多项式计算器
(vc环境,&符号)
#include
#include
#defineNull0
typedefstructLNode/*项的表示,多项式的项作为LinkList的数据元素*/
{
intcoef;/*系数*/
intexpn;/*指数*/
structLNode*next;
}LNode,*LinkList;
typedefLinkListpolynomial;/*用带有表头结点的有序链表表示多项式*/
voidCreatePolyn(polynomial&L)/*按尾插法产生一个n项多项式*/
{inti,n;
polynomialp,s;
L=(polynomial)malloc(sizeof(LNode));
L->next=Null;
p=L;
printf("请输入该多项式的总项数:
\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("输入第%d项系数,指数(用,号分隔)\n",i);
s=(polynomial