单链表的操作讲解.docx
- 文档编号:22989692
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:14
- 大小:69.84KB
单链表的操作讲解.docx
《单链表的操作讲解.docx》由会员分享,可在线阅读,更多相关《单链表的操作讲解.docx(14页珍藏版)》请在冰豆网上搜索。
单链表的操作讲解
《数据结构》实验报告二
系别:
电子工程系
班级:
智能一班
学号:
151********
姓名:
朱晓东
日期:
6.9
指导教师:
张阳
一、上机实验的问题和要求:
单链表的查找、插入与删除。
设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。
具体实现要求:
1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。
2.从键盘输入1个字符,在单链表中查找该结点的位置。
若找到,则显示“找到了”;否则,则显示“找不到”。
3.入在对从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插应位置上,输出单链表所有结点值,观察输出结果。
4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
输入十个字符
输出两个单链表
1定义结构体
typedefcharET;
typedefET*Ep;
typedefintStatus;
typedefstructLNode{
ETdata;
structLNode*next;
}LNode,*LinkList;
2建立链表
voidprintlk(LinkListL){
LinkListp;
p=L->next;
while(p){
printf("%c->",p->data);
p=p->next;
}
3分配空间
p=(LinkList)malloc(sizeof(LNode));
4植入
intInsert(LinkList*L){
inti,flag;
ETdata;
printf("Pleaseinputtheposition:
");
scanf("%d",&i);
printf("Pleaseinputthedata:
");
data=getche();/*scanf("%c",&data);*/
flag=ListInsert(L,i,data);
returnflag;
}
5
StatusDelete(LinkList*L){
inti,flag;
ETe;
printf("Pleaseinputthenumber:
");
scanf("%d",&i);
flag=ListDelete(L,i,&e);
printf("Deletedelementis%c\n",e);
returnflag;
}
查找intquery(student*Head,char*qname)
{
student*p;/*节点声明*/
p=Head;/*Pointer指针设为首节点*/
while(p!
=NULL)/*如果链表结束,则结束循环*/
{
if(!
strcmp(p->Name,qname))/*判断节点中的数据编号是否与待查值匹配*/
{
printf("TheStudentNumber:
%d\n",p->Number);/*输出节点的Number项的值*/
printf("TheStudentName:
%s\n",p->Name);/*输出节点的Name项的值*/
return1;/*查找了待查数据,函数返回值为1*/
}
p=p->Next;/*p指针指向下一个节点*/
}
return0;/*没有找到待查数据,函数返回值为0*/
插入intinsert(student*Head,char*qname,char*inname,intinno)
{
student*p,*new;/*节点声明*/
new=(student*)malloc(sizeof(student));
new->Number=inno;
strcpy(new->Name,inname);
p=Head;/*Pointer指针设为首节点*/
while(p!
=NULL)/*如果链表结束,则结束循环*/
{
if(!
strcmp(p->Name,qname))/*判断节点中的数据编号是否与待查值匹配*/
{
new->Next=p->Next;
p->Next=new;
return1;/*查找了待查数据,函数返回值为1*/
}
p=p->Next;/*p指针指向下一个节点*/
}
return0;/*没有找到待查数据,函数返回值为0*/
}
符号名说明
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
#defineList_Init_Size10
#defineListIncrement2
typedefcharET;
typedefET*Ep;
typedefintStatus;
三、源程序及注释:
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineTRUE1
#defineFALSE0
#defineList_Init_Size10
#defineListIncrement2
typedefcharET;
typedefET*Ep;
typedefintStatus;
typedefstructLNode{
ETdata;
structLNode*next;
}LNode,*LinkList;
/*LinkListLa,Lb,Lc;*/
#include"stdio.h"
#include"alloc.h"
/*Displaythelinklist'selements.*/
voidprintlk(LinkListL){
LinkListp;
p=L->next;
while(p){
printf("%c->",p->data);
p=p->next;
}
printf("NULL\n");
}
/*Creatlinklistfromheadnode.*/
voidCreatList(LinkList*L,intn){
inti;
LinkListp,q;
ETstr[20],c;
p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
*L=q=p;
printf("Pleaseinputthedata:
");
for(i=n;i>0;i--){
p=(LinkList)malloc(sizeof(LNode));
c=getche();/*scanf("%c",&c);*/
printf("\n\n");
p->data=c;
p->next=q->next;
q->next=p;
}
}
/*Initthelinklist.*/
voidInit(LinkList*L){
intn;
printf("Pleaseinputthenumberofthenode:
");
scanf("%d",&n);
CreatList(L,n);
}
/*GetthevalueofelementI;*/
intGetElem(LinkListL,inti,ET*e){
intj=1;
LinkListp;
p=L->next;
while(p&&j
p=p->next;
++j;
}
if(!
p||j>i)returnTRUE;
*e=p->data;
returnFALSE;
}
/*InsertaelementafterI*/
intListInsert(LinkList*L,inti,ETe)
{LiskList*p,*new;
New=(LiskList*)malloc(sizeof(LiskList));
P=head;
While(p!
=NULL)
{
If(!
strcmp(p->Lnode,e))
{New->next=p->next;
P->next=new;}
}
}
/*DeletetheelementI*/
intListDelete(LinkList*L,inti,ET*e)
{
}
intInsert(LinkList*L){
inti,flag;
ETdata;
printf("Pleaseinputtheposition:
");
scanf("%d",&i);
printf("Pleaseinputthedata:
");
data=getche();/*scanf("%c",&data);*/
flag=ListInsert(L,i,data);
returnflag;
}
StatusDelete(LinkList*L){
inti,flag;
ETe;
printf("Pleaseinputthenumber:
");
scanf("%d",&i);
flag=ListDelete(L,i,&e);
printf("Deletedelementis%c\n",e);
returnflag;
}
/*Findtheelement'sposition.*/
intLocateElem(LinkListL,ETe){
inti=0;
LinkListp;
p=L->next;
while(p){
i++;
if(p->data==e)returni;
}
return0;
}
/*AddtheLbaftertheLa.*/
voidUnion(LinkList*La,LinkList*Lb){
LinkListpa,pb;
/*Addyourowncodes.*/
}
/*Mergetwosequenceintoone,don'tchangeanyelementsin
thesetwolinklists.Jointwosequencetoone.*/
voidMergeList(LinkList*L1,LinkList*L2,LinkList*L3){
LinkListpa,pb,pc;
/*Addyourowncodes.*/
}
/*ListtheMenu*/
voidMenuList(){
printf("\n\n\n==========================\n");
printf("1*******InsertLA\n");
printf("2*******InsertLB\n");
printf("3*******DeleteLA\n");
printf("4*******DeleteLB\n");
printf("5*******UnionLAandLB\n");
printf("6*******MergeLAandLBtoLC\n");
printf("7*******printLinkList\n");
printf("8*******Exit\n");
printf("==========================\n");
}
/*Selectthemenu*/
voidMenuSelect(LinkList*La,LinkList*Lb){
intselect,done=1;
LinkListLc;
while(done){
MenuList();
printf("inputtheoperatingcode:
");
scanf("%d",&select);
switch(select){
case1:
Insert(La);break;
case2:
Insert(Lb);break;
case3:
Delete(La);break;
case4:
Delete(Lb);break;
case5:
Union(La,Lb);break;
case6:
MergeList(La,Lb,&Lc);
printf("LC:
");printlk(Lc);
break;
case7:
printf("LA:
");printlk(*La);
printf("LB:
");printlk(*Lb);
break;
case8:
done=0;break;
default:
printf("ERROR\n");
}
}
}
main(){
LinkListLa,Lb;
printf("La");
Init(&La);
printlk(La);
printf("LB");
Init(&Lb);
printlk(Lb);
MenuSelect(&La,&Lb);
}
四、运行输出结果:
1输入zxcvbnmlkj
输入qwertyuIop
_
3插入在3的后面asd给asd赋值为5
输入qwertyu输出qertyu删除w
五、调试和运行程序过程中产生的问题及采取的措施:
不会删除偶数点查的辅导书,
再调用程序时出现错误问的同学解决
六、对算法的程序的讨论、分析,改进设想,其它经验教训:
七、对实验方式、组织、设备、题目的意见和建议:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 操作 讲解
![提示](https://static.bdocx.com/images/bang_tan.gif)