数据结构专科辅导四.docx
- 文档编号:9362423
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:35
- 大小:21.02KB
数据结构专科辅导四.docx
《数据结构专科辅导四.docx》由会员分享,可在线阅读,更多相关《数据结构专科辅导四.docx(35页珍藏版)》请在冰豆网上搜索。
数据结构专科辅导四
数据结构专科辅导四
---单链表操作算法
下面三个程序都是用来实现单链表的定义和操作,每个程序均由头文件、实现文件和主文件。
第一个程序中的单链表结点为结构类型,结点的值为整型;第二个程序中的单链表结点同样为结构类型,结点的值为student结构类型;第三个程序中的单链表采用类的定义,操作函数为类中的成员函数,单链表中每个结点的值为整型。
程序1:
//头文件linklist1.h
//定义ElemType为int
typedefintElemType;
//单链表中结点的类型
structLNode{
ElemTypedata;//值域
LNode*next;//指针域
};
//初始化单链表
voidInitList(LNode*&HL);
//清空单链表
voidClearList(LNode*&HL);
//求单链表长度
intListSize(LNode*HL);
//检查单链表是否为空
boolListEmpty(LNode*HL);
//返回单链表中指定序号的结点值
ElemTypeGetElem(LNode*HL,intpos);
//遍历单链表
voidTraverseList(LNode*HL);
//从单链表中查找元素
boolFindList(LNode*HL,ElemType&item);
//更新单链表中的给定元素
boolUpdateList(LNode*HL,constElemType&item);
//向单链表插入元素
voidInsertList(LNode*&HL,constElemType&item,intmark);
//从单链表中删除元素
boolDeleteList(LNode*&HL,ElemType&item,intmark);
//对单链表进行有序输出
voidOrderOutputList(LNode*HL,intmark);
//实现文件linklist1.cpp
#include
#include
#include"linklist1.h"
//初始化单链表
voidInitList(LNode*&HL)
{
HL=NULL;
}
//清空单链表
voidClearList(LNode*&HL)
{
LNode*cp,*np;
cp=HL;
while(cp!
=NULL)
{
np=cp->next;
deletecp;
cp=np;
}
HL=NULL;
}
//求单链表长度
intListSize(LNode*HL)
{
LNode*p=HL;
inti=0;
while(p!
=NULL){
i++;
p=p->next;
}
returni;
}
//检查线性表是否为空
boolListEmpty(LNode*HL)
{
return(HL==NULL);
}
//返回单链表中指定序号的结点值
ElemTypeGetElem(LNode*HL,intpos)
{
if(pos<1){
cerr<<"posisoutrange!
"< exit (1); } LNode*p=HL; inti=0; while(p! =NULL){ i++; if(i==pos)break; p=p->next; } if(p! =NULL) returnp->data; else{ cerr<<"posisoutrange! "< exit (1); } } //遍历单链表 voidTraverseList(LNode*HL) { LNode*p=HL; while(p! =NULL){ cout< p=p->next; } cout< } //从单链表中查找元素 boolFindList(LNode*HL,ElemType&item) { LNode*p=HL; while(p! =NULL) if(p->data==item){ item=p->data; returntrue; } else p=p->next; returnfalse; } //更新单链表中的给定元素 boolUpdateList(LNode*HL,constElemType&item) { LNode*p=HL; while(p! =NULL)//查找元素 if(p->data==item) break; else p=p->next; if(p==NULL) returnfalse; else{//更新元素 p->data=item; returntrue; } } //向单链表插入元素 voidInsertList(LNode*&HL,constElemType&item,intmark) { //建立一个值为item的新结点 LNode*newptr; newptr=newLNode; newptr->data=item; //向表头插入结点 if(mark>0){ newptr->next=HL;HL=newptr; } //向表尾插入结点 elseif(mark<0){ if(HL==NULL){newptr->next=NULL;HL=newptr;} else{ LNode*p=HL; while(p->next! =NULL) p=p->next; p->next=newptr;newptr->next=NULL; } } //插入到合适位置 else{ LNode*cp; LNode*ap; ap=NULL;cp=HL; while(cp! =NULL){ if(item else{ap=cp;cp=cp->next;} } if(ap==NULL){newptr->next=HL;HL=newptr;} else{newptr->next=cp;ap->next=newptr;} } } //从单链表中删除元素 boolDeleteList(LNode*&HL,ElemType&item,intmark) { if(HL==NULL)returnfalse; //删除表头结点 if(mark>0){ LNode*p=HL; item=HL->data; HL=HL->next; deletep; returntrue; } //删除表尾结点 elseif(mark<0){ LNode*cp=HL,*ap=NULL; while(cp->next! =NULL){ ap=cp;cp=cp->next; } if(ap==NULL)HL=NULL; elseap->next=cp->next; item=cp->data; deletecp; returntrue; } //删除值为item结点 else{ LNode*cp=HL,*ap=NULL; while(cp! =NULL) if(cp->data==item)break; else{ap=cp;cp=cp->next;} if(cp==NULL)returnfalse; else{ if(ap==NULL)HL=HL->next; elseap->next=cp->next; item=cp->data; deletecp; returntrue; } } } //对单链表进行有序输出 voidOrderOutputList(LNode*HL,intmark) { if(HL==NULL){cout<<"链表为空! "< //建立新的单链有序表的表头结点 LNode*head=newLNode;//head为新建有序表的表头指针 head->data=HL->data;head->next=NULL; //根据HL单链表生成head单链有序表 for(LNode*p=HL->next;p;p=p->next){ LNode*q=newLNode; q->data=p->data; LNode*cp=head,*ap=NULL; //为向head单链表插入q结点而顺序查找合适位置 while(cp){ if(mark==1){ if(q->data else{ap=cp;cp=cp->next;} } else{ if(q->data>cp->data)break; else{ap=cp;cp=cp->next;} } } //把q结点插入head有序单链表中 if(ap==NULL){q->next=head;head=q;} else{ q->next=cp;ap->next=q; } } //遍历head有序单链表 TraverseList(head); //清除head有序单链表 ClearList(head); } //主文件linkmain1.cpp #include #include"linklist1.h" voidmain() { LNode*a; InitList(a); inti; ElemTypex; //依次向单链表a表尾插入5个整数元素 cout<<"从键盘输入5个整数: "; for(i=0;i<5;i++){ cin>>x; InsertList(a,x,-1); } //依次向单链表a表头插入2个整数元素 cout<<"从键盘输入2个整数: "; cin>>x;InsertList(a,x,1); cin>>x;InsertList(a,x,1); //按不同次序遍历输出单链表a TraverseList(a); OrderOutputList(a,1); OrderOutputList(a,0); //把单链表a中的所有元素依次有序插入到一个新单链表b中 LNode*b; InitList(b); for(LNode*p=a;p;p=p->next) InsertList(b,p->data,0); //输出单链表b TraverseList(b); //从单链表a中分别删除表头、表尾、给定值结点 if(DeleteList(a,x,1))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< if(DeleteList(a,x,-1))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< cout<<"从键盘上输入一个待删除的整数: "; cin>>x; if(DeleteList(a,x,0))cout<<"Deletesuccess! "< elsecout<<"Deletefail! "< //输出单链表a TraverseList(a); } 程序2: //头文件linklist2.h //定义学生记录 structstudent{ charname[10];//姓名 shortgrade;//分数 }; //定义ElemType为student类型 typedefstudentElemType; //单链表中结点的类型 structLNode{ ElemTypedata;//值域 LNode*next;//指针域 }; //初始化单链表 voidInitList(LNode*&HL); //清空单链表 voidClearList(LNode*&HL); //求单链表长度 intListSize(LNode*HL); //检查单链表是否为空 boolListEmpty(LNode*HL); //返回单链表中指定序号的结点值 ElemTypeGetElem(LNode*HL,intpos); //遍历单链表 voidTraverseList(LNode*HL); //从单链表中查找元素 boolFindList(LNode*HL,ElemType&item); //更新单链表中的给定元素 boolUpdateList(LNode*HL,constElemType&item); //向单链表插入元素 voidInsertList(LNode*&HL,constElemType&item,intmark); //从单链表中删除元素 boolDeleteList(LNode*&HL,ElemType&item,intmark); //对单链表进行有序输出 voidOrderOutputList(LNode*HL,intmark); //比较两个元素是否相等 booloperator==(constElemType&r1,constElemType&r2); //比较两个元素的大小 booloperator<(constElemType&r1,constElemType&r2); //输出一个元素 ostream&operator<<(ostream&ostr,constElemType&r); //输入一个元素 istream&operator>>(istream&istr,ElemType&r); //实现文件linklist2.cpp #include #include #include #include"linklist2.h" //初始化单链表 voidInitList(LNode*&HL) { HL=NULL; } //清空单链表 voidClearList(LNode*&HL) { LNode*cp,*np; cp=HL; while(cp! =NULL) { np=cp->next; deletecp; cp=np; } HL=NULL; } //求单链表长度 intListSize(LNode*HL) { LNode*p=HL; inti=0; while(p! =NULL){ i++; p=p->next; } returni; } //检查单链表是否为空 boolListEmpty(LNode*HL) { return(HL==NULL); } //返回单链表中指定序号的结点值 ElemTypeGetElem(LNode*HL,intpos) { if(pos<1){ cerr<<"posisoutrange! "< exit (1); } LNode*p=HL; inti=0; while(p! =NULL){ i++; if(i==pos)break; p=p->next; } if(p! =NULL) returnp->data; else{ cerr<<"posisoutrange! "< exit (1); } } //遍历单链表 voidTraverseList(LNode*HL) { LNode*p=HL; while(p! =NULL){ cout< p=p->next; } cout< } //从单链表中查找元素 boolFindList(LNode*HL,ElemType&item) { LNode*p=HL; while(p! =NULL) if(p->data==item){ item=p->data; returntrue; } else p=p->next; returnfalse; } //更新单链表中的给定元素 boolUpdateList(LNode*HL,constElemType&item) { LNode*p=HL; while(p! =NULL)//查找元素 if(p->data==item) break; else p=p->next; if(p==NULL) returnfalse; else{//更新元素 p->data=item; returntrue; } } //向单链表插入元素 voidInsertList(LNode*&HL,constElemType&item,intmark) { //建立一个值为item的新结点 LNode*newptr; newptr=newLNode; newptr->data=item; //向表头插入结点 if(mark>0){ newptr->next=HL;HL=newptr; } //向表尾插入结点 elseif(mark<0){ if(HL==NULL){newptr->next=NULL;HL=newptr;} else{ LNode*p=HL; while(p->next! =NULL) p=p->next; p->next=newptr;newptr->next=NULL; } } //插入到合适位置 else{ LNode*cp; LNode*ap; ap=NULL;cp=HL; while(cp! =NULL){ if(item else{ap=cp;cp=cp->next;} } if(ap==NULL){newptr->next=HL;HL=newptr;} else{newptr->next=cp;ap->next=newptr;} } } //从单链表中删除元素 boolDeleteList(LNode*&HL,ElemType&item,intmark) { if(HL==NULL)returnfalse; //删除表头结点 if(mark>0){ LNode*p=HL; item=HL->data; HL=HL->next; deletep; returntrue; } //删除表尾结点 elseif(mark<0){ LNode*cp=HL,*ap=NULL; while(cp->next! =NULL){ ap=cp;cp=cp->next; } if(ap==NULL)HL=NULL; elseap->next=cp->next; item=cp->data; deletecp; returntrue; } //删除值为item结点 else{ LNode*cp=HL,*ap=NULL; while(cp! =NULL) if(cp->data==item)break; else{ap=cp;cp=cp->next;} if(cp==NULL)returnfalse; else{ if(ap==NULL)HL=HL->next; elseap->next=cp->next; item=cp->data; deletecp; returntrue; } } } //对单链表进行有序输出 voidOrderOutputList(LNode*HL,intmark) { if(HL==NULL){cout<<"链表为空! "< //建立新的单链有序表的表头结点 LNode*head=newLNode;//head为新建有序表的表头指针 head->data=HL->data;head->next=NULL; //根据HL单链表生成head单链有序表 for(LNode*p=HL->next;p;p=p->next){ LNode*q=newLNode; q->data=p->data; LNode*cp=head,*ap=NULL; //为向head单链表插入q结点而顺序查找合适位置 while(cp){ if(mark==1){ if(q->data else{ap=cp;cp=cp->next;} } else{ if(cp->data else{ap=cp;cp=cp->next;} } } //把q结点插入head有序单链表中 if(ap==NULL){q->next=head;head=q;} else{ q->next=cp;ap->next=q; } } //遍历head有序单链表 TraverseList(head); //清除head有序单链表 ClearList(head); } //比较两个元素是否相等 booloperator==(constElemType&r1,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 专科 辅导