3数据结构实验3链表.docx
《3数据结构实验3链表.docx》由会员分享,可在线阅读,更多相关《3数据结构实验3链表.docx(18页珍藏版)》请在冰豆网上搜索。
3数据结构实验3链表
实验报告
院(系):
信息科学与技术学院课程名称:
数据结构日期:
班级
信A1321
学号
11314030119
实验室
专业
信息管理与信息系统
姓名
黄伟峰
计算机号
实验名称
实验三线性链表的运算
成绩评定
所用软件
VC或TC
教师签名
实
验
目
的
1.掌握线性链表的基本概念
2.掌握线性链表的建立、插入和删除等方法。
3.掌握线性链表的基本算法。
实
验
准
备
1.复习书上有关内容。
2.阅读实验内容1,进行程序填空,并编制相应的主函数。
3.编出实验内容的源程序。
实验总结
一、程序填空:
#include
#include
typedefcharelemtype;
typedefstructnode{
elemtypedata;
structnode*next;
}node,*linklist;
//建立链表
linklistcreatelistf()
{
charch;
linklisthead;
node*p;
head=(linklist)malloc(sizeof(node));//建立新节点
head->next=NULL;
ch=getchar();
while(ch!
='$')
{
p=(node*)malloc(sizeof(node));//建立新的节点
p->data=ch;
p->next=head->next;//将head插入头结点
head->next=p;
ch=getchar();
}
return(head);
}
//在链表的p指定节点后插入值为x的节点
intlink(node*p,charx)
{
node*s;//定义指向节点的指针
s=(node*)malloc(sizeof(node));
s->data=x;//将值插入s数据域中
s->next=p->next;
p->next=s;
return1;
}
//删除指点节点后的节点
voidDelLinkList(node*p)
{
node*q;
if(p->next!
=0)
{
q=p->next;//q指向p的后续节点
p->next=q->next;//修改p节点的指针域
free(q);//释放q
}
}
//在链表中查找指定的节点
node*lbcz(node*h,elemtypex)
{
node*p;
p=h->next;
while(p!
=0p->data!
=x)
{
p=p->next;
}
return(p);
}
//链表的输出
voidprintlink(node*h)
{
node*p;
p=h->next;
printf("\n");
while(p!
=0)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
voidmain()
{charx;
intm;
chary;
node*a;
node*b;
printf("输入值以'$'结束:
\n");
a=createlistf();
printlink(a);
printf("输入要查找的节点:
\n");
getchar();
scanf("%c",&x);
b=lbcz(a,x);
printlink(a);
DelLinkList(b);
printlink(a);
printf("输入要插入的值:
\n");
getchar();
scanf("%c",&y);
m=link(b,y);
if(m)
{
printf("插入成功!
");
printlink(a);
}
else
printf("插入失败!
");
}
二、源代码以及输入数据输出结果为:
//单链表中输入数据个数为10个,依次是{1,3,5,7,12,45,67,89,92,99}。
#include
#include
#include
typedefstructNode{
intdata;//数据域
structNode*pNext;//指针域
}NODE,*PNODE;//
//函数声明
PNODEcreate_list(void);
voidtreaverse_list(PNODEPHead);
PNODELocate(PNODEpHead,inte);//查找节点
intlink(PNODEp,inte);//插入函数
intmain(void)
{
inte=25;
PNODEpHead=NULL;//等价于structNode*Phead==NULL;
PNODEp;
pHead=create_list();//create_list()//功能:
创建一个非循环链表,并将该量表的空间给pHead
treaverse_list(pHead);
p=Locate(pHead,e);
treaverse_list(p);
link(p,e);
treaverse_list(pHead);
return0;
}
PNODEcreate_list(void)
{
intval;
intlen;//用于存放节点的有效个数
inti;
PNODEpHead=(PNODE)malloc(sizeof(Node));
if(NULL==pHead)
{
printf("分配失败,程序终止:
\n");
exit(-1);
}
PNODEPTail=pHead;
PTail->pNext=NULL;
printf("请输入要生成的链表数据个数:
len=");
scanf("%d",&len);
for(i=0;i{
printf("请输入第%d个节点的值:
",i+1);
scanf("%d",&val);
PNODEpNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
printf("分配失败,程序终止:
\n");
exit(-1);
}
pNew->data=val;
PTail->pNext=pNew;
pNew->pNext=NULL;
PTail=pNew;
}
returnpHead;
}
voidtreaverse_list(PNODEPHead)
{
PNODEp=PHead->pNext;
while(p!
=NULL)
{
printf("%5d",p->data);
p=p->pNext;
}
printf("\n");
}
PNODELocate(PNODEpHead,inte)//查找节点
{
PNODEp=pHead->pNext;
//PNODEq=(PNODE)malloc(sizeof(Node));
while(p!
=NULL){
if(p->pNext->data{
//q=p->pNext;
p=p->pNext;
}elsebreak;
}
returnp;
}
intlink(PNODEpHead,inte)//插入
{
PNODEp=pHead;
PNODEq=(PNODE)malloc(sizeof(Node));
q->data=e;//将值插入s数据域中
q->pNext=p->pNext;
p->pNext=q;
return1;
}
三、源代码以及实验结果为
#include
#include
typedefcharelemtype;
typedefstructnode{
elemtypedata;
structnode*next;
}NODE,*PNODE;
PNODEchuanjiang()//创建函数
{
charch;
PNODEhead;
NODE*p;
printf("头插法建立链表\n");
printf("请输入字符串,以回车键结束:
");
head=(PNODE)malloc(sizeof(NODE));
head->next=0;
ch=getchar();
while(ch!
='\n')
{p=(NODE*)malloc(sizeof(NODE));
p->data=ch;
p->next=head->next;
head->next=p;
ch=getchar();
}
return(head);
}
voidplink(NODE*h)//输出
{
NODE*p;
p=h->next;
printf("\n");
while(p!
=NULL)
{printf("%c",p->data);
p=p->next;
}
printf("\n");
}
voidshanchu(PNODEH){//删除
NODE*p,*q,*r;
p=H->next;
while(p!
=NULL)
{q=p;
while(q->next!
=NULL)
{if(q->next->data==p->data)
{r=q->next;
q->next=r->next;
free(r);
}
elseq=q->next;
}
p=p->next;
}
}
voidmain(){
NODE*h;
h=chuanjiang();
printf("创建的链表是:
\n");
plink(h);
printf("删除链表中相同的值:
\n");
shanchu(h);
printf("删除后链表的值:
\n");
plink(h);
}
四、源代码以及实验结果为
//单链表中输入数据个数为10个,依次是{1,3,5,7,12,45,67,89,92,99}。
#include
#include
#include
typedefstructNode{
intdata;//数据域
structNode*pNext;//指针域
}NODE,*PNODE;//
//函数声明
PNODEcreate_list(void);
voidtreaverse_list(PNODEPHead);
//链接函数
PNODEtwoLinkList(PNODEA,PNODEB);
intmain(void)
{
PNODEA=NULL;//等价于structNode*Phead==NULL;
PNODEB=NULL;
PNODEC=NULL;
A=create_list();//create_list()//功能:
创建一个非循环链表,并将该量表的空间给pHead
B=create_list();
treaverse_list(A);
treaverse_list(B);
C=twoLinkList(A,B);
treaverse_list(C);
return0;
}
PNODEcreate_list(void)
{
intval;
intlen;//用于存放节点的有效个数
inti;
PNODEpHead=(PNODE)malloc(sizeof(Node));
if(NULL==pHead)
{
printf("分配失败,程序终止:
\n");
exit(-1);
}
PNODEPTail=pHead;
PTail->pNext=NULL;
printf("请输入要生成的链表数据个数:
len=");
scanf("%d",&len);
for(i=0;i{
printf("请输入第%d个节点的值:
",i+1);
scanf("%d",&val);
PNODEpNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)
{
printf("分配失败,程序终止:
\n");
exit(-1);
}
pNew->data=val;
PTail->pNext=pNew;
pNew->pNext=NULL;
PTail=pNew;
}
returnpHead;
}
voidtreaverse_list(PNODEPHead)
{
PNODEp=PHead->pNext;
while(p!
=NULL)
{
printf("%5d",p->data);
p=p->pNext;
}
printf("\n");
}
PNODEtwoLinkList(PNODEA,PNODEB)//合并链表
{
PNODEpa=A->pNext;
PNODEpb=B->pNext;
PNODEpc;
PNODELc;
Lc=A;
Lc->pNext=NULL;
pc=Lc;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->pNext=pa;
pc=pa;
pa=pa->pNext;
}
else
{pc->pNext=pb;
pc=pb;
pb=pb->pNext;
}
}
pc->pNext=pa?
pa:
pb;
free(B);
return(Lc);
}
五、源代码以及实验结果为
#include
#include
typedefcharelemtype;
typedefstructnode{
elemtypedata;
structnode*next;
}NODE,*PNODE;
PNODEchuanjiang()
{
charch;
PNODEhead;
NODE*p;
head=(PNODE)malloc(sizeof(NODE));
head->next=head;
ch=getchar();
while(ch!
='\n')
{p=(NODE*)malloc(sizeof(NODE));
p->data=ch;
p->next=head->next;
head->next=p;
ch=getchar();
}
return(head);
}
voidplink(NODE*h){//单链表的输出
NODE*p;
p=h->next;
while(p!
=NULL){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
voidpooiplink(PNODEh){//循环链表的输出
NODE*p;
p=h->next;
while(p!
=h){
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
voidchaifen(PNODEh,PNODE*a,PNODE*b){
NODE*ar,*br,*p;
if(h->next==h)return;
(*a)=(PNODE)malloc(sizeof(NODE));
(*a)->next=*a;
ar=*a;
(*b)=(PNODE)malloc(sizeof(NODE));
(*b)->next=*a;
br=*b;
p=h->next;
while(p!
=h)
{if(p->data>='0'&&p->data<='9')
{ar->next=p;ar=ar->next;}
else
{br->next=p;br=br->next;}
p=p->next;
}
ar->next=*a;
br->next=*b;
}
voidmain(){
NODE*a;
PNODEb,c;
a=chuanjiang();
printf("建立的循环单链表:
");
plink(a);
printf("\n");
chaifen(a,&b,&c);
printf("拆分后的数字字符链表:
");
plink(b);
printf("拆分后的字母字符链表:
");
plink(c);
}六、实验体会: