链式存储结构的基本操作
} 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; } }
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
{ 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; }
有两个进程同时存在于一个应用程序中,第一个进程连续在 屏幕上显示字符“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 {
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() { 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);
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;