链式存储结构的基本操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室 2011年 月 日
计 算 机 科 学 年级、 与 学院 专业、 计机094 姓名 潘永航 教 班 育 软 件 学 院 实验 课程 数据结构 名称 实验 实验一 项目 的基本操作 名称 链式存储结构
学号 0923010089
成绩 指导 老师
void main() { int choice; LinkList head=NULL,list=NULL; head=(LinkList)malloc(sizeof(LNode)); cout<<"input LinkListA."<<endl; list=head->link=insert(list); head->data=line(head->link); while(1) { cout<<"\nwhat funtion do you want to execute?\n0-exit 1-insert 2-delete 3-overturn 4-combine.\nchoice-"; cin>>choice; switch(choice) { case 1:{ cout<<"插入新元素."<<endl; if(list->data<list->link->data||list->data==list>link->data) { cout<<"链表为升序,不用翻转."<<endl; list=head->link=insert(list); head->data=line(head->link); } else { head->link=overturnline(list); cout<<"链表已由降序翻转为升序."<<endl; list=head->link=insert(list); head->data=line(head->link); } }break; case 2:{ int item; cout<<"the item you want to delete="; cin>>item; list=head->link=deleteline(list,item);
一、实验目的
掌握单链表,链式堆栈,链式队列的定义及基本操作
二、使用仪器、器材
微机一台 操作系统:WinXP 编程软件:C++
三、实验内容及原理
(一)单链表的定义及基本操作 (1)用带表头的链表存放输入的数据,每读入一个数,按升 序顺序插入到链表中,链表中允许两个结点有相同值。链表 的头结点存放链表后面的结点个数,初始化时就生成头结点 (初值为0)。 (2)在上述带表头的链表中删除第i个结点或删除数值为 item的结点。 (3)链表翻转是把数据逆序(变成降序),注意,头结点不 动。翻转后要再翻转一次,恢复升序后才能插入新元素,否 则会出错。 (4)设A与B分别为两个带有头结点的有序循环链表(所谓有 序是指链接点按数据域值大小链接,本题不妨设按数据域值 从小到大排列),list1和list2分别为指向两个链表的指 针。请写出并在计算机上实现将这两个链表合并为一个带头 结点的有序循环链表的算法。 (二)链式堆栈的定义及基本操作 (5)先定义堆栈的几个基本操作,再设计一主函数利用堆栈 的操作完成以下功能:假设一个算术表达式中可以包含三种 括号:()[]{},且这三种括号可以按任意次序嵌套使用 (如:...[...{...}...[...]...]...(...))。编写判别给 定表达式中所含括号是否正确配对出现的算法,已知表达式 已存入数据元素为字符的单链表中。 (三)链式队列的定义及基本操作 (6)先定义队列的几个基本操作,再设计一主函数利用队列 的操作完成以下功能:键盘输入的字符可以临时存入键盘的 缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计 成链式循环队列的结构,并为循环队列结构的缓冲区设置一 个队首指针和一个队尾指针。每输入一个字符到缓冲区中, 就将尾指针后移,链入缓冲区的循环队列之中;每输出一个 字符号,就将队头指针前移,将它从缓冲队列中删除。假设
有两个进程同时存在于一个应用程序中,第一个进程连续在 屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输 入,若有则读入用户键入的字符,将其保存到键盘缓冲区 中。
四、实验过程原始数据记录 1、线性表的链表实现:插入、删除、翻转
#include<iostream> #include<malloc.h> using namespace std; typedef struct node { int data; struct node *link; }LNode,*LinkList; LinkList insert(LinkList &list) //新建一个链表 或插入新元素 { int item,n; LinkList p,q,r; //list第一个结点指针 cout<<"how many data do you want to insert:n="; cin>> n; for(int i=0;i<n;i++) { cout<<"data["<<i<<"]="; cin>>item; //输入储存的数据 p=(LinkList)malloc(sizeof(LNode)); //申请一个新的结 点 p->data=item; //将数据放入结点的数据域 p->link=NULL; //链尾结点指针域置空 if(list==NULL) { list=p; } else {
2、链式堆栈的实现
#include<iostream> #include<malloc.h> #define N 100 using namespace std; typedef struct node {
//定义链接堆栈类型
char data; struct node *link; }STNode,*STLink; int EMPTYSLINK(STLink top) //测试链接堆栈是否为空 { return(top==NULL); } int RUSHLINK(STLink &top,char item) //链接堆栈插入 { STLink p; if(!(p=(STLink)malloc(sizeof(STNode)))) return 0; else { p->data=item; p->link=top; top=p; return 1; } } int CHECK(STLink &top,int n,char STACK[]) { STLink p; p=(STLink)malloc(sizeof(STNode)); for(int i=0;i<n;i++) { if(STACK[i]=='('||STACK[i]=='{'||STACK[i]=='[') RUSHLINK(top,STACK[i]); else if(EMPTYSLINK(top)) return 2; else if((top->data=='(' && STACK[i]==')')||(top>data=='{' && STACK[i]=='}')||(top->data=='[' && STACK[i]==']')) {p=top;top=top->link;free(p);} else return 1; } if(!(EMPTYSLINK(top))) return 3; else return 4;
head->data=line(head->link); }break; case 3:{ list=head->link=overturnline(list); head->data=line(head->link); }break; case 4:{ LinkList listB=NULL; cout<<"input LinkListB."<<endl; listB=insert(listB); if(list->data<list->link->data||list->data==list>link->data) { cout<<"链表为升序,不用翻转.\nA、B链表合并后"; list=head->link=combine(list,listB); } else { cout<<"链表为降序,需翻转为升序."<<endl; head->link=overturnline(list); cout<<"链表已翻转为升序.\nA、B链表合并后"; list=head->link=combine(list,listB); } head->data=line(head->link); }break; case 0:exit(0);break; default:cout<<"wrong choice!please choose again."; } } }
if(item<list->data) //若a小于第一个链接点 { p->link=list; //将新的链接点插在链表最前面 list=p; //list指向被插入的新结点 } else { q=list; while(q!=NULL && item>=q->data) //寻 找插入位置 { r=q; //r指针总是指向当 前链接点的直接前驱结点 q=q->link; } p->link=q; r->link=p; //将新的链结点插在q指 示的链结点后面 } } } return (list); } LinkList deleteline(LinkList &list,int a) //删除链表中数 据域值为item的所有连接点 { LinkList p,q=list; p=list->link; while(p!=NULL) { if(p->data==a) { q->link=p->link; free(p); p=q->link; } else
Hale Waihona Puke Baidu
else { listC=listB; r=listB; q=listB->link; } while(p!=NULL && q!=NULL) { if(p->data<=q->data) { r->link=p; r=p; p=p->link; } else { r->link=q; r=q; q=q->link; } } r->link=p?p:q; return (listC); } int line(LinkList &q) //将数据域值链表排列展示 { int n=0; cout<<"数据域值从小到大排列的有序链表:"; while(q!=NULL) { n++; cout<<q->data<<' '; q=q->link; } cout<<"\n头结点后面的结点数n="<<n; return (n); }
} void main() { char STACK[N]; STLink top=NULL; cout<<"你想输入的括号总数:n="; int n; cin>>n; cout<<"输入含括号()、{}、[]的表达式:"; for(int i=0;i<n;i++) { cin>>STACK[i]; } int result=CHECK(top,n,STACK); switch(result) { case 1:cout<<"左右括号配对次序不正确"<<endl;break; case 2:cout<<"右括号多于左括号"<<endl;break; case 3:cout<<"左括号多于右括号"<<endl;break; case 4:cout<<"左右括号匹配正确"<<endl;break; } }
{ q=p; p=p->link; } } if(list->data==a) { q=list; list=list->link; free(q); } return(list); } LinkList overturnline(LinkList &list) //链表翻转 { LinkList p,q=NULL,r; p=list; while(p!=NULL) { r=q; q=p; p=p->link; q->link=r; } list=q; return (list); } LinkList combine(LinkList &listA,LinkList &listB) //将两个 按值有序链接的非空线性链表合并为一个 { LinkList listC,p=listA,q=listB,r; if(listA->data<=listB->data) { listC=listA; r=listA; p=listA->link; }
相关文档
最新文档