2.1,编写一个程序exp2-1.cpp,实现顺序表的各种基本运算功能(假设顺序表的元素类型为char),并在此基础上完成如下功能:
(1)初始化顺序表L;
(2)采用尾插法依次插入元素a,b,c,d,e;
(3)输出顺序表L;
(4)输出顺序表L长度;
(5)判断顺序表L是否为空;
(6)输出顺序表L的第三个元素;
(7)输出元素a的位置;
(8)在第四个元素位置上插入元素f;
(9)输出顺序表;
(10)删除L的第三个元素;
(11)输出顺序表L;
(12)释放顺序表L;
代码如下:
#include <iostream> #include <cstdio> #include <malloc.h> using namespace std; #define MaxSize 50 typedef struct{ char data[MaxSize]; int length; }SqList; void CreateList(SqList *&L,char a[],int n) { L=(SqList *)malloc(sizeof(SqList)); for (int i=0;i<n;i++) { L->data[i]=a[i]; } L->length=n; } void InitList(SqList *&L) { L=(SqList *)malloc(sizeof(SqList)); L->length=0; } void DestroyList(SqList *&L) { free(L); } bool ListEmpty(SqList *L) { return (L->length==0); } int ListLength(SqList *L) { return (L->length); } void DispList(SqList *L) { int i; for (i=0;i<L->length;i++) { printf("%c ",L->data[i]); } printf("\n"); } bool GetElem(SqList *L,int i,char &e) { if (i<1|| i>L->length) return false; e=L->data[i-1]; return true; } int LocateElem(SqList *L,char e) { int i=0; while (i<L->length&&L->data[i]!=e) { i++; } if (i>=L->length) return 0; else return i+1; } bool ListInsert(SqList *&L,int i,char e) { int j; if (i<1||i>L->length+1) return false; i--; for (j=L->length;j>i;j--) { L->data[j]=L->data[j-1]; } L->data[i]=e; L->length++; return true; } bool ListDelete(SqList *&L,int i,char &e) { int j; if (i<1||i>L->length) { return false; } i--; e=L->data[i]; for (j=i;j<L->length-1;j++) L->data[j]=L->data[j+1]; L->length--; return true; } int main() { SqList *L; char e; cout<<"(1)初始化顺序表L"<<endl; InitList(L); cout<<"(2)依次采用尾插法插入a,b,c,d,e元素"<<endl; ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); cout<<"(3)输出顺序表L:"; DispList(L); cout<<"(4)顺序表L长度="<<ListLength(L)<<endl; cout<<"(5)顺序表L为"<<(ListEmpty(L)?"空":"非空")<<endl; GetElem(L,3,e); cout<<"(6)顺序表L的第3个元素="<<e<<endl; cout<<"(7)元素a的位置="<<LocateElem(L,'a')<<endl; cout<<"(8)在第4个元素位置上插入f元素"<<endl; ListInsert(L,4,'f'); cout<<"(9)输出顺序表L:"; DispList(L); cout<<"(10)删除L的第3个元素"<<endl; ListDelete(L,3,e); cout<<"(11)输出顺序表L:"; DispList(L); cout<<"(12)释放顺序表L"<<endl; DestroyList(L); return 0; }
2.编写程序exp2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上完成如下功能;
(1)初始化单链表h;
(2)采用尾插法依次插入元素a,b,c,d,e;
(3)输出单链表h;
(4)输出单链表h长度;
(5)判断单链表h是否为空;
(6)输出单链表h的第三个元素;
(7)输出元素a的位置;
(8)在第四个元素位置上插入元素f;
(9)输出单链表h;
(10)删除h的第三个元素;
(11)输出单链表h;
(12)释放单链表h;
代码如下:
#include <iostream> #include <cstdio> #include <malloc.h> using namespace std; typedef struct LNode { char data; struct LNode *next; } LinkList; void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); } bool ListEmpty(LinkList *L) { return(L->next==NULL); } int ListLength(LinkList *L) { LinkList *p=L;int i=0; while (p->next!=NULL) { i++; p=p->next; } return(i); } void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); } bool GetElem(LinkList *L,int i,char &e) { int j=0; LinkList *p=L; while (j<i && p!=NULL) { j++; p=p->next; } if (p==NULL) return false; else { e=p->data; return true; } } int LocateElem(LinkList *L,char e) { int i=1; LinkList *p=L->next; while (p!=NULL && p->data!=e) { p=p->next; i++; } if (p==NULL) return(0); else return(i); } bool ListInsert(LinkList *&L,int i,char e) { int j=0; LinkList *p=L,*s; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL) return false; else { s=(LinkList *)malloc(sizeof(LinkList)); s->data=e; s->next=p->next; p->next=s; return true; } } bool ListDelete(LinkList *&L,int i,char &e) { int j=0; LinkList *p=L,*q; while (j<i-1 && p!=NULL) { j++; p=p->next; } if (p==NULL) return false; else { q=p->next; if (q==NULL) return false; e=q->data; p->next=q->next; free(q); return true; } } int main() { LinkList *L; char e; cout<<"(1)初始化单链表h"<<endl; InitList(L); cout<<"(2)依次采用尾插法插入a,b,c,d,e元素"<<endl; ListInsert(L,1,'a'); ListInsert(L,2,'b'); ListInsert(L,3,'c'); ListInsert(L,4,'d'); ListInsert(L,5,'e'); cout<<"(3)输出单链表h:"; DispList(L); cout<<"(4)单链表h长度="<<ListLength(L)<<endl; cout<<"(5)单链表h为"<<(ListEmpty(L)?"空":"非空")<<endl; GetElem(L,3,e); cout<<"(6)单链表h的第3个元素为"<<e<<endl;wew cout<<"(7)元素a的位置="<<LocateElem(L,'a')<<endl; cout<<"(8)在第4个元素位置上插入f元素"<<endl; ListInsert(L,4,'f'); cout<<"(9)输出单链表h:"; DispList(L); cout<<"(10)删除L的第3个元素"<<endl; ListDelete(L,3,e); cout<<"(11)输出单链表h:"; DispList(L); cout<<"(12)释放单链表h"<<endl; DestroyList(L); return 0; }
6.编写一个程序,采用单链表表示集合(集合中不存在重复的元素),将其按递增方式排序,构成有序单链表。并求这样的两个集合的并、交和差。
#include <iostream> #include <cstdio> #include <malloc.h> using namespace std; typedef struct LNode //定义单链表结点类型 { char data; struct LNode *next; } LinkList; void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%c ",p->data); p=p->next; } printf("\n"); } void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); } void CreateListR(LinkList *&L,char a[],int n) //尾插法建表 { LinkList *s,*r;int i; L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点 for (i=0;i<n;i++) { s=(LinkList *)malloc(sizeof(LinkList));//创建新结点 s->data=a[i]; r->next=s; //将*s插入*r之后 r=s; } r->next=NULL; //终端结点next域置为NULL } void sort(LinkList *&L) //单链表元素递增排序 { LinkList *p,*pre,*q; p=L->next->next; //p指向L的第2个数据节点 L->next->next=NULL; //构造只含一个数据节点的有序表 while (p!=NULL) { q=p->next; //q保存*p节点后继节点的指针 pre=L; //从有序表开头进行比较,pre指向插入*p的前驱节点 while (pre->next!=NULL && pre->next->data<p->data) pre=pre->next; //在有序表中找插入*p的前驱节点*pre p->next=pre->next; //将*pre之后插入*p pre->next=p; p=q; //扫描原单链表余下的节点 } } void Union(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合的并 { LinkList *pa=ha->next,*pb=hb->next,*s,*tc; hc=(LinkList *)malloc(sizeof(LinkList)); //创建头结点 tc=hc; while (pa!=NULL && pb!=NULL) { if (pa->data<pb->data) { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pa->data; tc->next=s;tc=s; pa=pa->next; } else if (pa->data>pb->data) { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pb->data; tc->next=s;tc=s; pb=pb->next; } else { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pa->data; tc->next=s;tc=s; pa=pa->next; //重复的元素只复制一个 pb=pb->next; } } if (pb!=NULL) pa=pb; //复制余下的结点 while (pa!=NULL) { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pa->data; tc->next=s;tc=s; pa=pa->next; } tc->next=NULL; } void InterSect(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合的差 { LinkList *pa=ha->next,*pb,*s,*tc; hc=(LinkList *)malloc(sizeof(LinkList)); tc=hc; while (pa!=NULL) { pb=hb->next; while (pb!=NULL && pb->data<pa->data) pb=pb->next; if (pb!=NULL && pb->data==pa->data) //若pa结点值在B中 { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pa->data; tc->next=s;tc=s; } pa=pa->next; } tc->next=NULL; } void Subs(LinkList *ha,LinkList *hb,LinkList *&hc) //求两有序集合的差 { LinkList *pa=ha->next,*pb,*s,*tc; hc=(LinkList *)malloc(sizeof(LinkList)); tc=hc; while (pa!=NULL) { pb=hb->next; while (pb!=NULL && pb->data<pa->data) pb=pb->next; if (!(pb!=NULL && pb->data==pa->data)) //若pa结点值不在B中 { s=(LinkList *)malloc(sizeof(LinkList)); //复制结点 s->data=pa->data; tc->next=s;tc=s; } pa=pa->next; } tc->next=NULL; } int main() { LinkList *ha,*hb,*hc; char a[]={'d','a','e','b'}; char b[]={'f','e','b','h','c','a'}; cout<<"集合的运算如下:"<<endl; CreateListR(ha,a,4); CreateListR(hb,b,6); cout<<"原 集 合A: "; DispList(ha); cout<<"原 集 合B: "; DispList(hb); sort(ha); sort(hb); cout<<"有序集合A: "; DispList(ha); cout<<"有序集合B: "; DispList(hb); Union(ha,hb,hc); cout<<"集合的并集C: "; DispList(hc); InterSect(ha,hb,hc); cout<<"集合的交集C: "; DispList(hc); Subs(ha,hb,hc); cout<<"集合的差集C: "; DispList(hc); DestroyList(ha); DestroyList(hb); DestroyList(hc); }