(数据结构)线性表的链式表示和实现(源代码)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
if(head==NULL)
returnOK;
else
returnERROR;
}
statuslistlength(node *head)
{
inti=0;
node*p;
p=head->next;
while(1)
{
i++;
if(p->next==NULL)
break;
p=p->next;
}
printf("该线性表的表长为%d\n",i);
break;
p=p->next;
i++;
}
if(p==NULL)
{
printf("该线性表中没有%d这个数据元素\n",e);
returnERROR;
}
printf("%d存在该线性表的第%d位\n",e,i);
returnOK;
}
statuspriorelem(node *head,inti,elemtype&e)
printf("第%d位数据元素的值为%d\n",n,e);
break;
case'7':
printf("请输入需要定位元素的值e=");
scanf("%d",&e);
getchar();
printf("\n");
locatelem(head,e);
break;
case'8':
printf("请输入需要插入的位置n=");
{
printf("该位上的数据元素为最后一个元素没有直接后继元素\n");
returnERROR;
}
elseif(p==NULL&&(j+1)<i)
{
printf("输入的i值不合法\n");
returnERROR;
}
}
structnode* insert(node *head,inti,elemtypee)
printf("\n第%d位的直接后继元素为%d\n",n,e);
break;
default:
printf("输入不合法……请选择:\n");
}
printf("\n\n\n");
}
}
system("cls");
switch(a)
{
case'0':
exit(0);
case'1':
printf("请输入需要创建元素的个数n\n");
scanf("%d",&n);
getchar();
head=createlist(head,n);
break;
case'2':
if(destroylist(head)==OK)
数据结构实验线性表的链式表示和实现(源代码)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INEEASLIBE -1
{
if(n<0)
{
printf("输入的n值不合法\n");
returnhead;
}
node*p,*q;
head=(structnode*)malloc(sizeof(structnode));
if(!head)
returnhead;
head->next=NULL;
head->date=n;
q=head;
getchar();
delete_node(head,n,e);
printf("已删除第%d位上的数据元素%d\n",n,e);
break;
case'a':
trip(head);
break;
case'b':
printf("请输入需要取出直接前驱元素的位数n=");
scanf("%d",&n);
getchar();
{
if(i==1)
{
printf("该位上的数据元素为一个元素没有直接前驱元素\n");
returnERROR;
}
structnode *p,*q;
p=head->next;
intj=1;
for(;p!=NULL;p=p->next)
{
if(j==i)
break;
q=p;
j++;
}
if(p!=NULL)
p=head->next;
intj=0;
for(;p->next!=NULL;p=p->next)
{
j++;
if(i==j)
break;
}
if(p->next!=NULL)
{
e=p->next->date;
printf("该位上有后继元素且直接后继元素的值已传递给e\n");
returnOK;
}
if(p->next==NULL&&(j+1)==i)
{
printf("输入的i值不合法\n");
returnhead;
}
structnode *p,*q;
p=head;
intj=1;
while(j<i)
{
if(p->next->next==NULL)
break;
p=p->next;
j++;
}
if(j==i)
{
q=p->next;
p->next=p->next->next;
{
head=NULL;
free(head);
printf("线性表销毁成功\n");
}
break;
case'3':
clearlist(head);
printf("线性表以置为空表\n");
break;
case'4':
if(listempty(head)==OK)
printf("线性表为空表\n");
{
e=q->date;
printf("该元素有数据元素并且直接前驱元素已传递给e\n");
returnOK;
}
else
{
printf("输入的i值不合法\n");
returnERROR;
}
}
statusnextelem(node *head,inti,elemtype&e)
{
structnode *p;
system("cls");
returnhead;
}
structnode*clearlist(node *head)
{
head=NULL;
returnhead;
}
statusdestroylist(node *head)
{
head=NULL;
free(head);
returnOK;
}
statuslistempty(node *head)
p=p->next;
i++;
}while(p!=NULL);
returnOK;
}
main()
{
structnode *head;
chara;
intn;
elemtypee;
while(1)
{
printf("1:构造一个线性表\n2:销毁线性表\n3:将已有线性表置为空表\n4:判断线性表是否为空\n5:计算已有线性表中数据元素的个数\n");
{
if(i<=0)
{
printf("输入的i值不合法\n");
returnhead;
}
structnode *q,*p;
q=head;
intj=1;
p=(structnode*)malloc(sizeof(structnode));
p->date=e;
while(j<i)
{
if(q->next==NULL)
returnOK;
}
statusgetelem(node *head,inti,elemtype&e)
{
node*p;
p=head->next;
intn=1;
if(i<1)
{
printf("输入的i值不合法\n");
returnERROR;
}
while(n<i)
{
p=p->next;
n++;
}
if(p==NULL)
break;
q=q->next;
j++;
}
if(jLeabharlann Baidu=i)
{
p->next=q->next;
q->next=p;
}
else
{
printf("输入的i值不合法\n");
}
returnhead;
}
structnode*delete_node(node *head,inti,elemtype&e)
{
if(i<=0)
if(priorelem(head,n,e)==OK)
printf("\n第%d位的直接前驱元素为%d\n",n,e);
break;
case'c':
printf("请输入需要取出直接后继元素的位数n=");
scanf("%d",&n);
getchar();
if(nextelem(head,n,e)==OK)
e=q->date;
free(q);
}
if(j<i)
printf("输入的i值不合法\n");
returnhead;
}
statustrip(node *head)
{
structnode *p;
p=head->next;
inti=1;
do
{
printf("第%d位===%d\n",i,p->date);
#define OVERFLOW -2
typedefintstatus;
typedefintelemtype;
#include"header.h"
structnode
{
elemtypedate;
structnode *next;
};
structnode*createlist(node *head,intn)
else
printf("线性表不为空表\n");
break;
case'5':
listlength(head);
break;
case'6':
printf("请输入需要取出元素的位数n=");
scanf("%d",&n);
getchar();
printf("\n");
getelem(head,n,e);
scanf("%d",&n);
getchar();
printf("\n该位置上的数据元素的值e=");
scanf("%d",&e);
getchar();
printf("\n");
head=insert(head,n,e);
break;
case'9':
printf("请输入需要删除的位置n=");
scanf("%d",&n);
inti=0;
for(;i<n;)
{
p=(structnode*)malloc(sizeof(structnode));
printf("请输入创建的结点数据元素的值\n");
scanf("%d",&p->date);
getchar();
p->next=NULL;
q->next=p;
q=p;
i++;
}
{
printf("输入的i值不合法\n");
returnERROR;
}
e=p->date;
returnOK;
}
statuslocatelem(node *head,elemtypee)
{
node*p;
inti=1;
p=head->next;
while(1)
{
if(p->date==e&&p==NULL)
printf("6:取出元素的值\n7:定位元素的位置\n8:插入新的数据元素\n9:删除某一个数据元素\na:显示该线性表中全部的元素\n");
printf("b:取出特定位置的直接前驱元素\nc:取出特定位置上直接后继元素\n0:退出\n\n\n");
scanf("%c",&a);
getchar();
if(head==NULL)
returnOK;
else
returnERROR;
}
statuslistlength(node *head)
{
inti=0;
node*p;
p=head->next;
while(1)
{
i++;
if(p->next==NULL)
break;
p=p->next;
}
printf("该线性表的表长为%d\n",i);
break;
p=p->next;
i++;
}
if(p==NULL)
{
printf("该线性表中没有%d这个数据元素\n",e);
returnERROR;
}
printf("%d存在该线性表的第%d位\n",e,i);
returnOK;
}
statuspriorelem(node *head,inti,elemtype&e)
printf("第%d位数据元素的值为%d\n",n,e);
break;
case'7':
printf("请输入需要定位元素的值e=");
scanf("%d",&e);
getchar();
printf("\n");
locatelem(head,e);
break;
case'8':
printf("请输入需要插入的位置n=");
{
printf("该位上的数据元素为最后一个元素没有直接后继元素\n");
returnERROR;
}
elseif(p==NULL&&(j+1)<i)
{
printf("输入的i值不合法\n");
returnERROR;
}
}
structnode* insert(node *head,inti,elemtypee)
printf("\n第%d位的直接后继元素为%d\n",n,e);
break;
default:
printf("输入不合法……请选择:\n");
}
printf("\n\n\n");
}
}
system("cls");
switch(a)
{
case'0':
exit(0);
case'1':
printf("请输入需要创建元素的个数n\n");
scanf("%d",&n);
getchar();
head=createlist(head,n);
break;
case'2':
if(destroylist(head)==OK)
数据结构实验线性表的链式表示和实现(源代码)
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INEEASLIBE -1
{
if(n<0)
{
printf("输入的n值不合法\n");
returnhead;
}
node*p,*q;
head=(structnode*)malloc(sizeof(structnode));
if(!head)
returnhead;
head->next=NULL;
head->date=n;
q=head;
getchar();
delete_node(head,n,e);
printf("已删除第%d位上的数据元素%d\n",n,e);
break;
case'a':
trip(head);
break;
case'b':
printf("请输入需要取出直接前驱元素的位数n=");
scanf("%d",&n);
getchar();
{
if(i==1)
{
printf("该位上的数据元素为一个元素没有直接前驱元素\n");
returnERROR;
}
structnode *p,*q;
p=head->next;
intj=1;
for(;p!=NULL;p=p->next)
{
if(j==i)
break;
q=p;
j++;
}
if(p!=NULL)
p=head->next;
intj=0;
for(;p->next!=NULL;p=p->next)
{
j++;
if(i==j)
break;
}
if(p->next!=NULL)
{
e=p->next->date;
printf("该位上有后继元素且直接后继元素的值已传递给e\n");
returnOK;
}
if(p->next==NULL&&(j+1)==i)
{
printf("输入的i值不合法\n");
returnhead;
}
structnode *p,*q;
p=head;
intj=1;
while(j<i)
{
if(p->next->next==NULL)
break;
p=p->next;
j++;
}
if(j==i)
{
q=p->next;
p->next=p->next->next;
{
head=NULL;
free(head);
printf("线性表销毁成功\n");
}
break;
case'3':
clearlist(head);
printf("线性表以置为空表\n");
break;
case'4':
if(listempty(head)==OK)
printf("线性表为空表\n");
{
e=q->date;
printf("该元素有数据元素并且直接前驱元素已传递给e\n");
returnOK;
}
else
{
printf("输入的i值不合法\n");
returnERROR;
}
}
statusnextelem(node *head,inti,elemtype&e)
{
structnode *p;
system("cls");
returnhead;
}
structnode*clearlist(node *head)
{
head=NULL;
returnhead;
}
statusdestroylist(node *head)
{
head=NULL;
free(head);
returnOK;
}
statuslistempty(node *head)
p=p->next;
i++;
}while(p!=NULL);
returnOK;
}
main()
{
structnode *head;
chara;
intn;
elemtypee;
while(1)
{
printf("1:构造一个线性表\n2:销毁线性表\n3:将已有线性表置为空表\n4:判断线性表是否为空\n5:计算已有线性表中数据元素的个数\n");
{
if(i<=0)
{
printf("输入的i值不合法\n");
returnhead;
}
structnode *q,*p;
q=head;
intj=1;
p=(structnode*)malloc(sizeof(structnode));
p->date=e;
while(j<i)
{
if(q->next==NULL)
returnOK;
}
statusgetelem(node *head,inti,elemtype&e)
{
node*p;
p=head->next;
intn=1;
if(i<1)
{
printf("输入的i值不合法\n");
returnERROR;
}
while(n<i)
{
p=p->next;
n++;
}
if(p==NULL)
break;
q=q->next;
j++;
}
if(jLeabharlann Baidu=i)
{
p->next=q->next;
q->next=p;
}
else
{
printf("输入的i值不合法\n");
}
returnhead;
}
structnode*delete_node(node *head,inti,elemtype&e)
{
if(i<=0)
if(priorelem(head,n,e)==OK)
printf("\n第%d位的直接前驱元素为%d\n",n,e);
break;
case'c':
printf("请输入需要取出直接后继元素的位数n=");
scanf("%d",&n);
getchar();
if(nextelem(head,n,e)==OK)
e=q->date;
free(q);
}
if(j<i)
printf("输入的i值不合法\n");
returnhead;
}
statustrip(node *head)
{
structnode *p;
p=head->next;
inti=1;
do
{
printf("第%d位===%d\n",i,p->date);
#define OVERFLOW -2
typedefintstatus;
typedefintelemtype;
#include"header.h"
structnode
{
elemtypedate;
structnode *next;
};
structnode*createlist(node *head,intn)
else
printf("线性表不为空表\n");
break;
case'5':
listlength(head);
break;
case'6':
printf("请输入需要取出元素的位数n=");
scanf("%d",&n);
getchar();
printf("\n");
getelem(head,n,e);
scanf("%d",&n);
getchar();
printf("\n该位置上的数据元素的值e=");
scanf("%d",&e);
getchar();
printf("\n");
head=insert(head,n,e);
break;
case'9':
printf("请输入需要删除的位置n=");
scanf("%d",&n);
inti=0;
for(;i<n;)
{
p=(structnode*)malloc(sizeof(structnode));
printf("请输入创建的结点数据元素的值\n");
scanf("%d",&p->date);
getchar();
p->next=NULL;
q->next=p;
q=p;
i++;
}
{
printf("输入的i值不合法\n");
returnERROR;
}
e=p->date;
returnOK;
}
statuslocatelem(node *head,elemtypee)
{
node*p;
inti=1;
p=head->next;
while(1)
{
if(p->date==e&&p==NULL)
printf("6:取出元素的值\n7:定位元素的位置\n8:插入新的数据元素\n9:删除某一个数据元素\na:显示该线性表中全部的元素\n");
printf("b:取出特定位置的直接前驱元素\nc:取出特定位置上直接后继元素\n0:退出\n\n\n");
scanf("%c",&a);
getchar();