2順序表及連結串列基本運算實現
阿新 • • 發佈:2019-02-05
實驗目的
深入掌握線性表的兩種儲存方法,即順序表和連結串列。體會這兩種儲存結構之間的差異。
實驗內容
1. 編寫一個程式exp2-1.cpp,實現順序表的各種運算(假設順序表的元素型別為char)
並在此基礎上完成如下功能:(1)初始化順序表L;
(2)採用尾插法依次插入元素a,b,c,d,e;
(3)輸出順序表L;
(4)輸出順序表L的長度;
(5)判斷順序表L是否為空;
(6)輸出順序表L的第3個元素;
(7)輸出元素a的位置;
(8)在第4個元素位置上插入元素f;
(9)輸出順序表L;
(10)刪除L的第3個元素;
(11)輸出順序表L;
(12)釋放順序表L
#include <iostream> #include <malloc.h> using namespace std; typedef char ElemType; typedef class Sqlist{ public: ElemType data[100]; int length; }; void CreateList(Sqlist *&L,ElemType a[],int n); void InitList(Sqlist *&L); void DisList(Sqlist *L);//輸出元素 void ListLength(Sqlist *L);//輸出長度 bool judge(Sqlist *L); //判斷線性表是否為空 bool getElem(Sqlist *L,int i); //輸出線性表第e個元素 int LocatElem(Sqlist *L,ElemType e); //8.輸出指定元素位置 bool ListInsert(Sqlist *L,int i,ElemType e); //9.在第i個元素位置上插入元素e bool ListDle(Sqlist *L,int i,ElemType e); //刪除元素 void DestroyList(Sqlist *&L); //銷燬線性表 int main() { Sqlist *L; char a[]={'a','b','c','d','e'}; cout<<"(1)初始化線性表"<<endl; InitList(L); cout<<"(2)採用尾插法依次插入元素a,b,c,d,e"<<endl; CreateList(L,a,5); cout<<"(3)輸出順序表L:"; DisList(L); cout<<"(4)順序表L的長度="; ListLength(L); cout<<"(5)順序表L為"; if(judge(L)) cout<<"空!"<<endl; else cout<<"非空!"<<endl; cout<<"(6)順序表的第三個元素="; if(getElem(L,3)); cout<<"(7)元素a的位置:"<<LocatElem(L,'a'); cout<<"(8)在第四個位置插入元素f"; if(ListInsert(L,4,'f')) cout<<endl; cout<<"(9)輸出順序表:"; DisList(L); cout<<"(10)刪除線性表L第三個元素"; if(ListDle(L,3,'e')); cout<<endl; cout<<"(11)輸出順序表:"; DisList(L); cout<<"(12)釋放線性表"<<endl; DestroyList(L); return 0; } void CreateList(Sqlist *&L,ElemType a[],int n) { int i; 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 DisList(Sqlist *L) //輸出元素 { for(int i=0;i<L->length;++i) { cout<<L->data[i]<<" "; } cout<<endl; } void ListLength(Sqlist *L) //輸出長度 { cout<<L->length<<endl; } bool judge(Sqlist *L) //判斷線性表是否為空 { return(L->length==0); } bool getElem(Sqlist *L,int i) //7.輸出線性表第e個元素 { if(i<1||i>L->length) return false; cout<<L->data[i-1]<<endl; return true; } int LocatElem(Sqlist *L,ElemType e) //8.輸出指定元素位置 { 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,ElemType e) //9.在第i個元素位置上插入元素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 ListDle(Sqlist *L,int i,ElemType e) //9.在第i個元素位置上插入元素e { int j; if(i<1||i>L->length+1) return false; i--; e=L->data[i]; for(j=i;j<L->length;++j) L->data[j]=L->data[j+1]; L->length--; return true; } void DestroyList(Sqlist *&L) //銷燬線性表 { free(L); }
2. 編寫一個程式exp2-2.cpp,實現單鏈表的各種基本運算(假設單鏈表的元素型別為char)
並在此基礎上完成如下功能:
(1)初始化單鏈表h;
(2)採用尾插法依次插入元素a,b,c,d,e;
(3)輸出單鏈表h;
(4)輸出單鏈表h長度;
(5)判斷單鏈表h是否為空;
(6)輸出單鏈表h的第3個元素;
(7)輸出元素a的位置;
(8)在第4個元素位置上插入元素f;
(9)輸出單鏈表h;
(10)刪除h的第3個元素;
(11)輸出單鏈表h;
(12)釋放單鏈表h
#include <iostream> #include <malloc.h> using namespace std; typedef char ElemType; typedef class Linklist{ public: ElemType data; Linklist *next; }; void CreateList(Linklist *&L,ElemType a[],int n); void InitList(Linklist *&L); void DisList(Linklist *L);//輸出元素 void ListLength(Linklist *L);//輸出長度 bool judge(Linklist *L); //判斷線性表是否為空 bool getElem(Linklist *L,int i); //輸出線性表第e個元素 int LocatElem(Linklist *L,ElemType e); //8.輸出指定元素位置 bool ListInsert(Linklist *L,int i,ElemType e); //9.在第i個元素位置上插入元素e bool ListDle(Linklist *L,int i,ElemType e); //刪除元素 void DestroyList(Linklist *&L); //銷燬線性表 int main() { Linklist *L; char a[]={'a','b','c','d','e'}; cout<<"(1)初始化單鏈表"<<endl; InitList(L); cout<<"(2)採用尾插法依次插入元素a,b,c,d,e"<<endl; //if(L->data=='x') // cout<<'Y'<<endl; CreateList(L,a,5); cout<<"(3)輸出單鏈表h:"; DisList(L); cout<<"(4)單鏈表h的長度="; ListLength(L); cout<<"(5)單鏈表h為"; if(judge(L)) cout<<"空!"<<endl; else cout<<"非空!"<<endl; cout<<"(6)單鏈表的第三個元素="; if(getElem(L,3)); cout<<"(7)元素a的位置:"<<LocatElem(L,'a')<<endl; cout<<"(8)在第四個位置插入元素f"; if(ListInsert(L,4,'f')) cout<<endl; cout<<"(9)輸出單鏈表h:"; DisList(L); cout<<"(10)刪除單鏈表h第三個元素"; if(ListDle(L,3,'e')); cout<<endl; cout<<"(11)輸出單鏈表:"; DisList(L); cout<<"(12)釋放單鏈表"<<endl; DestroyList(L); return 0; } void CreateList(Linklist *&L,ElemType a[],int n) { Linklist *s,*r; int i; L=(Linklist * )malloc(sizeof(Linklist)); r=L; for(int i=0;i<n;++i) { s=(Linklist *)malloc(sizeof(Linklist)); s->data=a[i]; cout<<s->data<<endl; r->next=s; r=s; } r->next=NULL; } void InitList(Linklist *&L) { L=(Linklist * )malloc(sizeof(Linklist)); L->next=NULL; } void DisList(Linklist *L) //輸出元素 { Linklist *p=L; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } void ListLength(Linklist *L) //輸出長度 { int n=0; Linklist *p=L; while(p->next!=NULL) { n++; p=p->next; } cout<<n<<endl; } bool judge(Linklist *L) //判斷線性表是否為空 { return(L->next==NULL); } bool getElem(Linklist *L,int i) //7.輸出線性表第e個元素 { int j=0; Linklist *p=L; while(j<i&&p!=NULL) { j++; p=p->next; } if(p==NULL) return false; else { cout<<p->data<<endl; return true; } } int LocatElem(Linklist *L,ElemType e) //8.輸出指定元素位置 { 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,ElemType e) //9.在第i個元素位置上插入元素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 ListDle(Linklist *L,int i,ElemType e) //9.在第i個元素位置上s刪除元素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; } } void DestroyList(Linklist *&L) //銷燬線性表 { free(L); }