大数据结构邹永林版实验报告材料2顺序表与链表.docx
《大数据结构邹永林版实验报告材料2顺序表与链表.docx》由会员分享,可在线阅读,更多相关《大数据结构邹永林版实验报告材料2顺序表与链表.docx(32页珍藏版)》请在冰豆网上搜索。
大数据结构邹永林版实验报告材料2顺序表与链表
实验二顺序表与链表
【实验目的】
1、掌握线性表中元素的前驱、后续的概念。
2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。
3、对线性表相应算法的时间复杂度进行分析。
4、理解顺序表、链表数据结构的特点(优缺点)。
【实验学时】
2学时
【实验预习】
回答以下问题:
1、顺序表的存储表示
在顺序表中,任一数据元素的存放位置是从起始位置开始、与该数据元素的位序成正比的对应存储位置,借助LOC(ai)=LOC(a1)+(i-1)*1 确定,则顺序表是一种随机存取的存储结构。
2、单链表的存储表示
线性链表也称单链表,在每一个结点中只包含一个指针,用于指示该结点的直接后继结点,整个链表通过指针相连,最后一个结点因为没有后继结点,其指针置为空(NULL)。
这样,链表中所有数据元素(结点)构成一对一的逻辑关系,实现线性表的链式存储。
【实验内容和要求】
1、按照要求完成程序exp2_1.c,实现顺序表的相关操作。
以下函数均具有返回值,若操作完成,返回OK,操作失败返回ERROR。
函数需返回的其他数据,使用函数参数返回。
exp2_1.c部分代码如下:
#include
#defineERROR0
#defineMAXSIZE100
#defineOK1
typedefintElemType;/*定义表元素的类型*/
typedefstructslist{
ElemType*list;
intlistsize;
intlength;
}Sqlist;
Sqlist*L;
/*
(1)---补充顺序表的存储分配表示,采用定长和可变长度存储均可*/
/*函数声明*/
intInitList_sq(Sqlist*L);
intCreateList_sq(Sqlist*L);
intListInsert_sq(Sqlist*L,inti,ElemTypee);
intPrintList_sq(Sqlist*L);
intListDelete_sq(Sqlist*L,inti,ElemType*e);
intListLocate(Sqlist*L,ElemTypee,int*pos);
intmenu_select();
(2)---顺序表的初始化*/
intInitList_sq(Sqlist*L)
{
L->list=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(L->list==NULL)
returnERROR;
else
L->length=0;
L->listsize=MAXSIZE;
}
return0;
}/*InitList*/
/*(3)---创建具有n个元素的顺序表*/
intCreateList_sq(Sqlist*L)
inta,b,c;
printf("请输入输入数据的个数n:
");
scanf("%d",&a);
printf("请输入输入的数据:
for(b=0;b{scanf("%d",&c);L->list[b]=c;}L->length=L->length+a;return0;}/*CreateList*//*(4)---输出顺序表中的元素*/intPrintList_sq(Sqlist*L){inta;printf("输出数据:");for(a=0;alength;a++)printf("%d",L->list[a]);return0;}/*PrintList*//*(5)---在顺序表的第i个位置之前插入新元素e*/intListInsert_sq(Sqlist*L,inti,ElemTypee){inta=L->length-1;for(;a>=i-1;a--)L->list[a+1]=L->list[a];L->list[i-1]=e;L->length+=1;returnOK;}/*ListInsert*//*(6)---在顺序表中删除第i个元素,e返回删除的元素*/intListDelete_sq(Sqlist*L,inti,ElemType*e){inta=i-1;*e=L->list[i-1];for(;alength;a++)L->list[a]=L->list[a+1];L->length-=1;returnOK;}/*ListDelete_sq*//*(7)---在顺序表中查找指定值元素,pos为返回其位置序号*/intListLocate(Sqlist*L,ElemTypee,int*pos){inta,b=0;for(a=0;alength;a++){if(e==L->list[a]){b=0;*pos=a+1;break;}elseb=1;}if(b==1)return0;elsereturnOK;}/*ListLocate*//*定义菜单字符串数组*/intmenu_select(){char*menu[]={"\n***************MENU******************\n","1.CreateList\n",/*创建顺序表*/"2.GetElement\n",/*查找顺序表中的元素*/"3.Insertdata\n",/*插入数据*/"4.Deletedata\n",/*删除数据*/"0.Quit\n",/*退出*/"\n***************MENU******************\n"};chars[3];/*以字符形式保存选择号*/intc,i;/*定义整形变量*/for(i=0;i<7;i++)/*输出主菜单数组*/printf("%s",menu[i]);do{printf("\nEnteryouchoice(0~4):");/*在菜单窗口外显示提示信息*/scanf("%s",s);/*输入选择项*/c=atoi(s);/*将输入的字符串转化为整形数*/}while(c<0||c>4);/*选择项不在0~4之间重输*/returnc;/*返回选择项,主程序根据该数调用相应的函数*/}/*主函数*/intmain(){intm,k;intpos;intdeldata;Sqlistsl;InitList_sq(&sl);for(;;)/*无限循环*/{switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/{case1:printf("\n1-CreateSqlist:\n");CreateList_sq(&sl);printf("\nPrintSqlist:\n");PrintList_sq(&sl);break;case2:printf("\n3-GetElemfromSqlist:\n");printf("pleaseinputsearchdata:");scanf("%d",&k);if(!ListLocate(&sl,k,&pos))printf("Notfound");else{printf("foundtheelement,positionis%d\n",pos);printf("\nPrintSqlist:\n");PrintList_sq(&sl);}break;case3:printf("\n4-InsertfromSqlist:\n");printf("\ninputinsertlocationanddata:(location,data)\n");scanf("%d,%d",&m,&k);if(ListInsert_sq(&sl,m,k)){printf("\nOK\n");printf("\nPrintSqlist:\n");PrintList_sq(&sl);}elseprintf("\nERROR!");break;case4:printf("\n5-DeletefromSqlist:\n");printf("\npleaseinputdeletelocation\n");scanf("%d",&k);if(ListDelete_sq(&sl,k,&deldata)){printf("\nOK\n");printf("\nDeletedatais%d\n",deldata);printf("\nPrintSqlist:\n");PrintList_sq(&sl);}elseprintf("\nERROR!");break;case0:exit(0);/*如菜单返回值为0程序结束*/}}return0;}(1)创建一个顺序表(2)查找元素位置(3)插入元素(4)删除元素2、按照要求完成程序exp2_2.c,实现单链表的相关操作。exp2_2.c部分代码如下:#include#include#include#defineERROR0#defineOK1typedefintElemType;/*定义表元素的类型*//*(1)---线性表的单链表存储表示*/typedefstructLNode{ElemTypedate;structLNode*next;}LNode,*LinkList; LNode*InitList();/*带头结点单链表初始化*/voidPrintList(LinkListL);/*输出带头结点单链表的所有元素*/intGetElem(LinkListL,inti,ElemType*e);/*查找第i位置的元素,并由e返回其值*/intInsertElem(LinkListL,inti,ElemTypee);/*在第i个位置插入元素e*/intDeleteElem(LinkListL,inti,ElemType*e);/*删除第i位置的元素,并由e返回其值*/voidDestroyLinkList(LinkListL);/*释放链表及其空间*/LinkListCreateList(intn);/*创建n个结点的单链表*/intmenu_select();/*菜单函数*//*带头结点单链表初始化*/LNode*InitList(){LinkListL;L=(LNode*)malloc(sizeof(LNode));/*申请一个头结点*/if(!L)returnERROR;/*申请失败*/L->next=NULL;/*头结点的指针域置空*/returnL;}/*(1)---输出带头结点单链表的所有元素*/voidPrintList(LinkListL){LNode*p=L->next;inti=0;while(p){i++;printf("\n第%d个元素%d",i,p->date);p=p->next;}}/*PrintList*//*(2)---在单链表的第i个位置插入元素e,若插入成功返回OK,插入失败返回ERROR*/intInsertElem(LinkListL,inti,ElemTypee){LNode*p=L,*s;intj=0;while(p&&j{p=p->next;j++;}if(!p||j>i-1)returnERROR;s=(LNode*)malloc(sizeof(LNode));if(!s)returnERROR;s->date=e;s->next=p->next;p->next=s;returnOK;}/*InsertElem*//*(3)---查找第i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/intGetElem(LinkListL,inti,ElemType*e){LNode*p;intj=1;p=L->next;while(p&&j{p=p->next;j++;}if(!p||j>i)returnERROR;*e=p->date;returnOK;}/*GetElem*//*(4)---删除第i位置的元素,成功返回OK,并由e返回其值,若不成功返回ERROR,注意删除的结点必须释放其所占空间*/intDeleteElem(LinkListL,inti,ElemType*e){LNode*p=L,*s;intj=0;while(p&&j{p=p->next;j++;}if(!p||j>i-1)returnERROR;s=p->next;p->next=s->next;*e=s->date;free(s);returnOK;}/*DeleteElem*//*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/LinkListCreateList(intn){inti=1;LNode*p,*q,*L;L=InitList();p=L;while(i<=n){q=(LNode*)malloc(sizeof(LNode));printf("输入链表的结点date%d:",i++);scanf("%d",&q->date);q->next=NULL;p->next=q;p=q;}returnL;}/*CreateList*//*释放链表及其空间*/voidDestroyLinkList(LinkListL){LNode*p=L,*q;while(p){q=p->next;free(p);p=q;}}/*DestroyLinkList*/intmenu_select(){char*menu[]={"\n***************MENU******************\n","1.InitLinkList\n",/*初始化链表*/"2.GetElement\n",/*查找元素*/"3.Insertdata\n",/*插入元素*/"4.Deletedata\n",/*删除元素*/"5.CreateLinkList\n",/*创建具有n个元素的链表*/"0.DestroyLinkList&&Quit\n",/*释放链表所占空间&退出*/"\n***************MENU******************\n"};chars[3];/*以字符形式保存选择号*/intc,i;/*定义整形变量*/for(i=0;i<8;i++)/*输出主菜单数组*/{printf("%s",menu[i]);}do{printf("\nEnteryouchoice(0~5):");/*在菜单窗口外显示提示信息*/scanf("%s",s);/*输入选择项*/c=atoi(s);/*将输入的字符串转化为整形数*/}while(c<0||c>5);/*选择项不在0~5之间重输*/returnc;/*返回选择项,主程序根据该数调用相应的函数*/}intmain(){inti,n;ElemTypee;LinkListL=NULL;/*定义指向单链表的指针*/for(;;)/*无限循环*/{switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/{/*值不同,执行的函数不同,break不能省略*/case1:printf("\n1-InitLinkList:\n");L=InitList(L);if(L!=NULL)printf("\nInitLinkListOK!\n");elseprintf("\nInitLinkListError!\n");break;case2:printf("\n2-GetElemfromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&GetElem(L,i,&e)){printf("No%iis%d",i,e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("Error&Notexists!");break;case3:printf("\n3-InserteintoLinkList:\n");printf("inputpos=");scanf("%d",&i);printf("inpute=");scanf("%d",&e);if(L!=NULL&&InsertElem(L,i,e)){printf("\nInsertOK!\n");printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nInsertError!\n");break;case4:printf("\n4-DeletefromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&DeleteElem(L,i,&e)){printf("\nOK\n");printf("\nDeletedatais%d\n",e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nDeleteError!\n");break;case5:printf("pleaseinputn:");/*输入单链表的元素个数*/scanf("%d",&n);if(n<0){printf("ERROR");break;}printf("\nCreateLinkList......\n");L=CreateList(n);if(L==NULL){printf("Error!\n");break;}printf("\nPrintfList:\n");PrintList(L);break;case0:printf("\nDestroylinklistandfreememory......\n");if(L!=NULL){DestroyLinkList(L);L=NULL;}exit(0);/*如菜单返回值为0程序结束*/}}return0;}实验结果:(1)初始化链表:(2)查找元素:(3)插入数据:(4)删除数据:(5)创建链表:(6)销毁和退出链表:3循环链表的应用(约瑟夫回环问题、)用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下:#include#include#defineERROR0#defineOK1typedefintElemType;/*定义表元素的类型*/typedefstructLNode/*线性表的单链表存储*/{ElemTypedata;structLNode*next;}LNode,*LinkList;/*(1)---创建具有n个结点的无头结点的单向循环链表,返回其头指针*/LinkListCreateList(intn){LinkListL;L=(LinkList)malloc(sizeof(LinkList));LNode*q,*p;printf("输入元素:\n");scanf("%d",&L->data);q=L;inta;for(a=0;a{p=(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;q=p;}q->next=L;returnL;}/*CreateList*//*(2)---输出无头结点循环单链表的所有元素*/voidPrintList(LinkListL){printf("输出表中的元素:");LNode*p;printf("%d\n",L->data);p=L->next;while(p!=L){printf("\n%d\n",p->data);p=p->next;}}/*PrintList*/
scanf("%d",&c);
L->list[b]=c;
L->length=L->length+a;
}/*CreateList*/
/*(4)---输出顺序表中的元素*/
intPrintList_sq(Sqlist*L)
inta;
printf("输出数据:
for(a=0;alength;a++)
printf("%d",L->list[a]);
}/*PrintList*/
/*(5)---在顺序表的第i个位置之前插入新元素e*/
intListInsert_sq(Sqlist*L,inti,ElemTypee)
inta=L->length-1;
for(;a>=i-1;a--)
L->list[a+1]=L->list[a];
L->list[i-1]=e;
L->length+=1;
returnOK;
}/*ListInsert*/
/*(6)---在顺序表中删除第i个元素,e返回删除的元素*/
intListDelete_sq(Sqlist*L,inti,ElemType*e)
inta=i-1;
*e=L->list[i-1];
for(;alength;a++)
L->list[a]=L->list[a+1];
L->length-=1;
}/*ListDelete_sq*/
/*(7)---在顺序表中查找指定值元素,pos为返回其位置序号*/
intListLocate(Sqlist*L,ElemTypee,int*pos)
inta,b=0;
if(e==L->list[a])
b=0;
*pos=a+1;
break;
b=1;
if(b==1)
}/*ListLocate*/
/*定义菜单字符串数组*/
intmenu_select()
char*menu[]={"\n***************MENU******************\n",
"1.CreateList\n",/*创建顺序表*/
"2.GetElement\n",/*查找顺序表中的元素*/
"3.Insertdata\n",/*插入数据*/
"4.Deletedata\n",/*删除数据*/
"0.Quit\n",/*退出*/
"\n***************MENU******************\n"
};
chars[3];/*以字符形式保存选择号*/
intc,i;/*定义整形变量*/
for(i=0;i<7;i++)/*输出主菜单数组*/
printf("%s",menu[i]);
do
printf("\nEnteryouchoice(0~4):
");/*在菜单窗口外显示提示信息*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整形数*/
while(c<0||c>4);/*选择项不在0~4之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
/*主函数*/
intmain()
intm,k;
intpos;
intdeldata;
Sqlistsl;
InitList_sq(&sl);
for(;;)/*无限循环*/
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
case1:
printf("\n1-CreateSqlist:
\n");
CreateList_sq(&sl);
printf("\nPrintSqlist:
PrintList_sq(&sl);
case2:
printf("\n3-GetElemfromSqlist:
printf("pleaseinputsearchdata:
scanf("%d",&k);
if(!
ListLocate(&sl,k,&pos))
printf("Notfound");
printf("foundtheelement,positionis%d\n",pos);
case3:
printf("\n4-InsertfromSqlist:
printf("\ninputinsertlocationanddata:
(location,data)\n");
scanf("%d,%d",&m,&k);
if(ListInsert_sq(&sl,m,k))
printf("\nOK\n");
printf("\nERROR!
case4:
printf("\n5-DeletefromSqlist:
printf("\npleaseinputdeletelocation\n");
if(ListDelete_sq(&sl,k,&deldata))
printf("\nDeletedatais%d\n",deldata);
case0:
exit(0);/*如菜单返回值为0程序结束*/
(1)创建一个顺序表
(2)查找元素位置
(3)插入元素
(4)删除元素
2、按照要求完成程序exp2_2.c,实现单链表的相关操作。
exp2_2.c部分代码如下:
(1)---线性表的单链表存储表示*/
typedefstructLNode
ElemTypedate;
structLNode*next;
}LNode,*LinkList;
LNode*InitList();/*带头结点单链表初始化*/
voidPrintList(LinkListL);/*输出带头结点单链表的所有元素*/
intGetElem(LinkListL,inti,ElemType*e);/*查找第i位置的元素,并由e返回其值*/
intInsertElem(LinkListL,inti,ElemTypee);/*在第i个位置插入元素e*/
intDeleteElem(LinkListL,inti,ElemType*e);/*删除第i位置的元素,并由e返回其值*/
voidDestroyLinkList(LinkListL);/*释放链表及其空间*/
LinkListCreateList(intn);/*创建n个结点的单链表*/
intmenu_select();/*菜单函数*/
/*带头结点单链表初始化*/
LNode*InitList()
LinkListL;
L=(LNode*)malloc(sizeof(LNode));/*申请一个头结点*/
L)returnERROR;/*申请失败*/
L->next=NULL;/*头结点的指针域置空*/
returnL;
(1)---输出带头结点单链表的所有元素*/
voidPrintList(LinkListL)
LNode*p=L->next;
inti=0;
while(p)
i++;
printf("\n第%d个元素%d",i,p->date);
p=p->next;
(2)---在单链表的第i个位置插入元素e,若插入成功返回OK,插入失败返回ERROR*/
intInsertElem(LinkListL,inti,ElemTypee)
LNode*p=L,*s;
intj=0;
while(p&&j{p=p->next;j++;}if(!p||j>i-1)returnERROR;s=(LNode*)malloc(sizeof(LNode));if(!s)returnERROR;s->date=e;s->next=p->next;p->next=s;returnOK;}/*InsertElem*//*(3)---查找第i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/intGetElem(LinkListL,inti,ElemType*e){LNode*p;intj=1;p=L->next;while(p&&j{p=p->next;j++;}if(!p||j>i)returnERROR;*e=p->date;returnOK;}/*GetElem*//*(4)---删除第i位置的元素,成功返回OK,并由e返回其值,若不成功返回ERROR,注意删除的结点必须释放其所占空间*/intDeleteElem(LinkListL,inti,ElemType*e){LNode*p=L,*s;intj=0;while(p&&j{p=p->next;j++;}if(!p||j>i-1)returnERROR;s=p->next;p->next=s->next;*e=s->date;free(s);returnOK;}/*DeleteElem*//*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/LinkListCreateList(intn){inti=1;LNode*p,*q,*L;L=InitList();p=L;while(i<=n){q=(LNode*)malloc(sizeof(LNode));printf("输入链表的结点date%d:",i++);scanf("%d",&q->date);q->next=NULL;p->next=q;p=q;}returnL;}/*CreateList*//*释放链表及其空间*/voidDestroyLinkList(LinkListL){LNode*p=L,*q;while(p){q=p->next;free(p);p=q;}}/*DestroyLinkList*/intmenu_select(){char*menu[]={"\n***************MENU******************\n","1.InitLinkList\n",/*初始化链表*/"2.GetElement\n",/*查找元素*/"3.Insertdata\n",/*插入元素*/"4.Deletedata\n",/*删除元素*/"5.CreateLinkList\n",/*创建具有n个元素的链表*/"0.DestroyLinkList&&Quit\n",/*释放链表所占空间&退出*/"\n***************MENU******************\n"};chars[3];/*以字符形式保存选择号*/intc,i;/*定义整形变量*/for(i=0;i<8;i++)/*输出主菜单数组*/{printf("%s",menu[i]);}do{printf("\nEnteryouchoice(0~5):");/*在菜单窗口外显示提示信息*/scanf("%s",s);/*输入选择项*/c=atoi(s);/*将输入的字符串转化为整形数*/}while(c<0||c>5);/*选择项不在0~5之间重输*/returnc;/*返回选择项,主程序根据该数调用相应的函数*/}intmain(){inti,n;ElemTypee;LinkListL=NULL;/*定义指向单链表的指针*/for(;;)/*无限循环*/{switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/{/*值不同,执行的函数不同,break不能省略*/case1:printf("\n1-InitLinkList:\n");L=InitList(L);if(L!=NULL)printf("\nInitLinkListOK!\n");elseprintf("\nInitLinkListError!\n");break;case2:printf("\n2-GetElemfromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&GetElem(L,i,&e)){printf("No%iis%d",i,e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("Error&Notexists!");break;case3:printf("\n3-InserteintoLinkList:\n");printf("inputpos=");scanf("%d",&i);printf("inpute=");scanf("%d",&e);if(L!=NULL&&InsertElem(L,i,e)){printf("\nInsertOK!\n");printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nInsertError!\n");break;case4:printf("\n4-DeletefromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&DeleteElem(L,i,&e)){printf("\nOK\n");printf("\nDeletedatais%d\n",e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nDeleteError!\n");break;case5:printf("pleaseinputn:");/*输入单链表的元素个数*/scanf("%d",&n);if(n<0){printf("ERROR");break;}printf("\nCreateLinkList......\n");L=CreateList(n);if(L==NULL){printf("Error!\n");break;}printf("\nPrintfList:\n");PrintList(L);break;case0:printf("\nDestroylinklistandfreememory......\n");if(L!=NULL){DestroyLinkList(L);L=NULL;}exit(0);/*如菜单返回值为0程序结束*/}}return0;}实验结果:(1)初始化链表:(2)查找元素:(3)插入数据:(4)删除数据:(5)创建链表:(6)销毁和退出链表:3循环链表的应用(约瑟夫回环问题、)用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下:#include#include#defineERROR0#defineOK1typedefintElemType;/*定义表元素的类型*/typedefstructLNode/*线性表的单链表存储*/{ElemTypedata;structLNode*next;}LNode,*LinkList;/*(1)---创建具有n个结点的无头结点的单向循环链表,返回其头指针*/LinkListCreateList(intn){LinkListL;L=(LinkList)malloc(sizeof(LinkList));LNode*q,*p;printf("输入元素:\n");scanf("%d",&L->data);q=L;inta;for(a=0;a{p=(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;q=p;}q->next=L;returnL;}/*CreateList*//*(2)---输出无头结点循环单链表的所有元素*/voidPrintList(LinkListL){printf("输出表中的元素:");LNode*p;printf("%d\n",L->data);p=L->next;while(p!=L){printf("\n%d\n",p->data);p=p->next;}}/*PrintList*/
j++;
p||j>i-1)
s=(LNode*)malloc(sizeof(LNode));
s)returnERROR;
s->date=e;
s->next=p->next;
p->next=s;
}/*InsertElem*/
/*(3)---查找第i位置的元素,若存在返回OK并由e返回其值,若不存在返回ERROR*/
intGetElem(LinkListL,inti,ElemType*e)
LNode*p;
intj=1;
p=L->next;
while(p&&j
p||j>i)
*e=p->date;
}/*GetElem*/
/*(4)---删除第i位置的元素,成功返回OK,并由e返回其值,若不成功返回ERROR,注意删除的结点必须释放其所占空间*/
intDeleteElem(LinkListL,inti,ElemType*e)
while(p&&j{p=p->next;j++;}if(!p||j>i-1)returnERROR;s=p->next;p->next=s->next;*e=s->date;free(s);returnOK;}/*DeleteElem*//*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/LinkListCreateList(intn){inti=1;LNode*p,*q,*L;L=InitList();p=L;while(i<=n){q=(LNode*)malloc(sizeof(LNode));printf("输入链表的结点date%d:",i++);scanf("%d",&q->date);q->next=NULL;p->next=q;p=q;}returnL;}/*CreateList*//*释放链表及其空间*/voidDestroyLinkList(LinkListL){LNode*p=L,*q;while(p){q=p->next;free(p);p=q;}}/*DestroyLinkList*/intmenu_select(){char*menu[]={"\n***************MENU******************\n","1.InitLinkList\n",/*初始化链表*/"2.GetElement\n",/*查找元素*/"3.Insertdata\n",/*插入元素*/"4.Deletedata\n",/*删除元素*/"5.CreateLinkList\n",/*创建具有n个元素的链表*/"0.DestroyLinkList&&Quit\n",/*释放链表所占空间&退出*/"\n***************MENU******************\n"};chars[3];/*以字符形式保存选择号*/intc,i;/*定义整形变量*/for(i=0;i<8;i++)/*输出主菜单数组*/{printf("%s",menu[i]);}do{printf("\nEnteryouchoice(0~5):");/*在菜单窗口外显示提示信息*/scanf("%s",s);/*输入选择项*/c=atoi(s);/*将输入的字符串转化为整形数*/}while(c<0||c>5);/*选择项不在0~5之间重输*/returnc;/*返回选择项,主程序根据该数调用相应的函数*/}intmain(){inti,n;ElemTypee;LinkListL=NULL;/*定义指向单链表的指针*/for(;;)/*无限循环*/{switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/{/*值不同,执行的函数不同,break不能省略*/case1:printf("\n1-InitLinkList:\n");L=InitList(L);if(L!=NULL)printf("\nInitLinkListOK!\n");elseprintf("\nInitLinkListError!\n");break;case2:printf("\n2-GetElemfromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&GetElem(L,i,&e)){printf("No%iis%d",i,e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("Error&Notexists!");break;case3:printf("\n3-InserteintoLinkList:\n");printf("inputpos=");scanf("%d",&i);printf("inpute=");scanf("%d",&e);if(L!=NULL&&InsertElem(L,i,e)){printf("\nInsertOK!\n");printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nInsertError!\n");break;case4:printf("\n4-DeletefromLinkList:\n");printf("inputpos=");scanf("%d",&i);if(L!=NULL&&DeleteElem(L,i,&e)){printf("\nOK\n");printf("\nDeletedatais%d\n",e);printf("\nPrintfList:\n");PrintList(L);}elseprintf("\nDeleteError!\n");break;case5:printf("pleaseinputn:");/*输入单链表的元素个数*/scanf("%d",&n);if(n<0){printf("ERROR");break;}printf("\nCreateLinkList......\n");L=CreateList(n);if(L==NULL){printf("Error!\n");break;}printf("\nPrintfList:\n");PrintList(L);break;case0:printf("\nDestroylinklistandfreememory......\n");if(L!=NULL){DestroyLinkList(L);L=NULL;}exit(0);/*如菜单返回值为0程序结束*/}}return0;}实验结果:(1)初始化链表:(2)查找元素:(3)插入数据:(4)删除数据:(5)创建链表:(6)销毁和退出链表:3循环链表的应用(约瑟夫回环问题、)用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。依次输出每个出局的人的序号。提示:用一个无头结点的循环单链表来实现n个元素的存储。exp2_3.c部分代码如下:#include#include#defineERROR0#defineOK1typedefintElemType;/*定义表元素的类型*/typedefstructLNode/*线性表的单链表存储*/{ElemTypedata;structLNode*next;}LNode,*LinkList;/*(1)---创建具有n个结点的无头结点的单向循环链表,返回其头指针*/LinkListCreateList(intn){LinkListL;L=(LinkList)malloc(sizeof(LinkList));LNode*q,*p;printf("输入元素:\n");scanf("%d",&L->data);q=L;inta;for(a=0;a{p=(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;q=p;}q->next=L;returnL;}/*CreateList*//*(2)---输出无头结点循环单链表的所有元素*/voidPrintList(LinkListL){printf("输出表中的元素:");LNode*p;printf("%d\n",L->data);p=L->next;while(p!=L){printf("\n%d\n",p->data);p=p->next;}}/*PrintList*/
s=p->next;
p->next=s->next;
*e=s->date;
free(s);
}/*DeleteElem*/
/*(5)---创建具有n个结点的单链表,创建成功返回其头指针*/
LinkListCreateList(intn)
inti=1;
LNode*p,*q,*L;
L=InitList();
p=L;
while(i<=n)
q=(LNode*)malloc(sizeof(LNode));
printf("输入链表的结点date%d:
",i++);
scanf("%d",&q->date);
q->next=NULL;
p->next=q;
p=q;
/*释放链表及其空间*/
voidDestroyLinkList(LinkListL)
LNode*p=L,*q;
q=p->next;
free(p);
}/*DestroyLinkList*/
"1.InitLinkList\n",/*初始化链表*/
"2.GetElement\n",/*查找元素*/
"3.Insertdata\n",/*插入元素*/
"4.Deletedata\n",/*删除元素*/
"5.CreateLinkList\n",/*创建具有n个元素的链表*/
"0.DestroyLinkList&&Quit\n",/*释放链表所占空间&退出*/
for(i=0;i<8;i++)/*输出主菜单数组*/
printf("\nEnteryouchoice(0~5):
while(c<0||c>5);/*选择项不在0~5之间重输*/
inti,n;
ElemTypee;
LinkListL=NULL;/*定义指向单链表的指针*/
/*值不同,执行的函数不同,break不能省略*/
printf("\n1-InitLinkList:
L=InitList(L);
if(L!
=NULL)
printf("\nInitLinkListOK!
printf("\nInitLinkListError!
printf("\n2-GetElemfromLinkList:
printf("inputpos=");
scanf("%d",&i);
=NULL&&GetElem(L,i,&e))
printf("No%iis%d",i,e);
printf("\nPrintfList:
PrintList(L);
printf("Error&Notexists!
printf("\n3-InserteintoLinkList:
printf("inpute=");
scanf("%d",&e);
=NULL&&InsertElem(L,i,e))
printf("\nInsertOK!
printf("\nInsertError!
printf("\n4-DeletefromLinkList:
=NULL&&DeleteElem(L,i,&e))
printf("\nDeletedatais%d\n",e);
printf("\nDeleteError!
case5:
printf("pleaseinputn:
");/*输入单链表的元素个数*/
scanf("%d",&n);
if(n<0)
printf("ERROR");
printf("\nCreateLinkList......\n");
L=CreateList(n);
if(L==NULL)
printf("Error!
printf("\nDestroylinklistandfreememory......\n");
DestroyLinkList(L);
L=NULL;
实验结果:
(1)初始化链表:
(2)查找元素:
(3)插入数据:
(4)删除数据:
(5)创建链表:
(6)销毁和退出链表:
3循环链表的应用(约瑟夫回环问题、)
用整数序列1,2,3,…,n表示顺序坐在圆桌周围的人,并采用循环链表作为存储结构。
任意位置k开始计数,计到m让此位置的人出局,重复上述过程,直至只剩下最后一个人。
依次输出每个出局的人的序号。
提示:
用一个无头结点的循环单链表来实现n个元素的存储。
exp2_3.c部分代码如下:
typedefstructLNode/*线性表的单链表存储*/
ElemTypedata;
(1)---创建具有n个结点的无头结点的单向循环链表,返回其头指针*/
L=(LinkList)malloc(sizeof(LinkList));
LNode*q,*p;
printf("输入元素:
scanf("%d",&L->data);
q=L;
for(a=0;a{p=(LNode*)malloc(sizeof(LNode));scanf("%d",&p->data);q->next=p;q=p;}q->next=L;returnL;}/*CreateList*//*(2)---输出无头结点循环单链表的所有元素*/voidPrintList(LinkListL){printf("输出表中的元素:");LNode*p;printf("%d\n",L->data);p=L->next;while(p!=L){printf("\n%d\n",p->data);p=p->next;}}/*PrintList*/
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=p;
q->next=L;
(2)---输出无头结点循环单链表的所有元素*/
printf("输出表中的元素:
printf("%d\n",L->data);
while(p!
=L){
printf("\n%d\n",p->data);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1