資料結構(一)之順序表與連結串列
阿新 • • 發佈:2018-12-11
運用陣列結構來構建的線性表就是順序表。
本例實現了順序表的列印、清空、判斷是否為空、求表長、獲得指定下標的元素、獲得指定元素的下標、插入和刪除操作。
#include<iostream> const int MAXSIZE=100; using namespace std; struct L{ int a[MAXSIZE+1]; int n; }sqlist; void PrintList(L sqlist); void ClearList(L &sqlist); bool ListEmpty(L sqlist); int Listlength(L sqlist); int GetElem(L sqlist,int i); int Locate(L sqlist,int e); void ListInsert(L &sqlist,int i,int e); int ListDelete(L &sqlist,int i); int main(){ for(int i=0;i<10;i++){ sqlist.a[i]=i+1; sqlist.n++; } /*以下是測試程式碼 ListInsert(sqlist,3,5); cout<<ListDelete(sqlist,4)<<endl; */ PrintList(sqlist); return 0; } void PrintList(L sqlist){ for(int i=0;i<sqlist.n;i++){ cout<<sqlist.a[i]<<ends; } } void ClearList(L &sqlist){ for(int i=0;i<sqlist.n;i++){ sqlist.a[i]=0; } sqlist.n=0; } bool ListEmpty(L sqlist){ if(sqlist.n==0) return true; else return false; } int Listlength(L sqlist){ return sqlist.n; } int GetElem(L sqlist,int i){ return sqlist.a[i-1]; } int Locate(L sqlist,int e){ for(int i=0;i<sqlist.n;i++){ if(sqlist.a[i]==e) return i+1; } } void ListInsert(L &sqlist,int i,int e){ for(int j=sqlist.n-1;j>=i-1;j--){ sqlist.a[j+1]=sqlist.a[j]; } sqlist.a[i-1]=e; sqlist.n++; } int ListDelete(L &sqlist,int i){ int e; e=sqlist.a[i-1]; for(int j=i-1;j<sqlist.n;j++){ sqlist.a[j]=sqlist.a[j+1]; } sqlist.n--; return e; }
運用鏈式結構來構建的線性表就是連結串列。
本例實現了連結串列的插入、刪除、列印、清空、判斷是否為空、求表長、獲得指定下標的元素、獲得指定元素的下標和翻轉等操作。(註釋中還包括了雙向連結串列的定義,有序連結串列的合併,單迴圈連結串列的刪除指定元素結點、連結、刪除第i個結點,單鏈表改雙向連結串列,靜態連結串列的宣告、初始化、插入、刪除和連結串列多項式的相加)
#include<iostream> #include<cstdlib> using namespace std; typedef struct node{ int data; //資料域 struct node *next; //指標域(後) //struct node *prior; 雙向連結串列前指標域 }NODE_t; NODE_t *CreatNodeList(int n); int InsertNode(NODE_t *head,int data); int DeleteNodeOfList(NODE_t *head,int i); void PrintList(NODE_t *head); void ClearList(NODE_t *head); bool ListEmpty(NODE_t *head); int Listlength(NODE_t *head); int GetElem(NODE_t *head,int i); int Locate(NODE_t *head,int e); void Reverse(NODE_t *head); int main(){ NODE_t *p; /*以下是測試程式碼 p=CreatNodeList(4); InsertNode(p,3); PrintList(p); cout<<GetElem(p,2)<<endl; cout<<Locate(p,3)<<endl; Reverse(p); PrintList(p); ClearList(p); PrintList(p); cout<<ListEmpty(p)<<endl; cout<<Listlength(p)<<endl; */ return 0; } NODE_t *CreatNodeList(int n){ NODE_t *head,*rear,*p; head=(NODE_t *)malloc(sizeof(NODE_t)); rear=head; for(int i=1;i<=n;i++){ p=(NODE_t *)malloc(sizeof(NODE_t)); scanf("%d",&p->data); rear->next=p; rear=p; } rear->next=NULL; return head; } int InsertNode(NODE_t *head,int data){ NODE_t *cur = NULL; if(!head) exit(-1); cur = (NODE_t *)malloc(sizeof(NODE_t)); if(!cur) exit(-1); cur->data = data;//cur 插入到 head 和 head->next 之間 cur->next = head->next; head->next = cur; return 0; } int DeleteNodeOfList(NODE_t *head,int i,int e){ NODE_t *p=head; int j=0; while(p->next!=NULL&&j<i-1){ p=p->next; j++; } if(p->next!=NULL&&j==i-1){ NODE_t *q=p->next; p->next=q->next; e=q->data; free(q); } return 0; } void PrintList(NODE_t *head){ NODE_t *p=head->next; while(p!=NULL){ cout<<p->data<<endl; p=p->next; } } void ClearList(NODE_t *head){ head->next=NULL; } bool ListEmpty(NODE_t *head){ if(head->next==NULL) return true; else return false; } int Listlength(NODE_t *head){ int i=0; if(head->next==NULL) return 0; else{ while(head->next!=NULL){ i++; head=head->next; } } return i; } int GetElem(NODE_t *head,int i){ int j=1; for(j=1;j<=i;j++) head=head->next; return head->data; } int Locate(NODE_t *head,int e){ int i=1; if(head!=NULL){ while(head->data!=e){ head=head->next; i++; } return i; } else return -1; } void Reverse(NODE_t *head){ NODE_t *s,*p=head->next; head->next=NULL; while(p!=NULL){ s=p; p=p->next; s->next=head->next; head->next=s; } } /*連結串列有序合併 if(pa->data<=pb->data) //只要有一個表不為空的迴圈過程a,b為舊錶,c為新表 {rc->next=pa;rc=pa;pa=pa->next;} else{rc->next=pb;rc=pb;pb=pb->next;} if(pa!=NULL) rc->next=pa; //若某一連結串列空,將另一連結串列放在表c之後 else rc->next=pb; 單向迴圈連結串列的刪除 刪除p結點 void del_pre(NODE_t *p){ NODE_t *rear=p; while(rear->next->next!=p) rear=rear->next; free(rear->next); rear->next=p; } 迴圈單鏈表的連結 head1=rear1->next; rear1->next=rear2->next; rear2->next=head1; 刪除第i個結點(結點p) p->prior->next=p->next; p->next->prior=p->prior; free(p); 單鏈表改雙向連結串列 void cre_dulink(NODE_t *ha){ NODE_t *p=ha; while(p->next->prior==NULL){ p->next->prior=p; p=p->next; } } 靜態連結串列的宣告 #define n0 100 #define datatype char struct element{ datatype data; int next; }; struct staticlist{ element s[n0+1]; int head,avail; }; struct staticlist L; 靜態連結串列初始化 L.head=0; L.avail=1; for(i=1;i<n0;i++) L.s[i].next=i+1; L.s[n0].next=0; 靜態連結串列插入 void insert(staticlist &L,int p,datatype x){ //插入p之後 int q; if(L.avail==0) printf("儲存空間不夠"); else{ q=L.avail; L.avail=L.s[q].next; L.s[q].data=x; L.s[q].next=L.s[p].next; L.s[p].next=q; } } 靜態連結串列的刪除 q=L.s[p].next; L.s[p].next=L.s[q].next; L.s[q].next=L.avail; L.avail=q; 多項式相加 struct pnode{ int expn; //指數 float coef; //係數 struct pnode *next; }; typedef struct pnode* pointer; void addpoly(pointer pa,pointer pb,pointer &pc){ //pa,pb,pc三個多項式連結串列的頭結點。pc=pa+pb p=pa->next; q=pb->next; pc=pa; rc=pc; //pc,rc新連結串列的頭指標和尾指標 while(p&&q){ //兩多項式均未結束時,比較指數;將較小指數的結點鏈入新多項式連結串列 if(p->exp<q->exp){ rc->next=p; rc=p; p=p->next; } if(p->exp==q->exp){ x=p->coef+q->coef; if(x!=0){ p->coef=x; rc->next=p; rc=p; p=p->next; } else{ u=p; p=p->next; delete u; } u=q; q=q->next; delete u; } if(p->exp>q->exp){ rc->next=q; rc=q; q=q->next; } } if(p){ rc->next=p; } else{ rc->next=q; } } */