單鏈表的基本操作的實現 C++實現
阿新 • • 發佈:2022-04-21
定義單鏈表結點型別
#include<stdio.h> //定義單鏈表結點型別 typedef struct LNode{ int data; //結點的資料域 LNode *next; //結點的指標域 }LNode, *LinkList; //LinkList為指向結構體LNode的指標型別
單鏈表的初始化
//單鏈表的初始化 void InitList(LinkList &L){ L=new LNode;//分配一個頭結點 或L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; }
判斷連結串列是否為空
//判斷連結串列是否為空 bool ListEmpty(LinkList L){ if(L->next==NULL) //判斷頭結點指標域是否為空 return true; else return false; }
銷燬單鏈表
//銷燬單鏈表 void DestroyList(LinkList &L){ LNode *p;//或LinkList p; while(L){ p=L; L=L->next; delete p; } }
清空單鏈表(只留頭結點)
//清空單鏈表(只留頭結點)void ClearList(LinkList &L){ LNode *p,*q;//或LinkList p,q; p=L->next; //p指向要刪除的結點 while(p){ q=p->next; //q指向要刪除的下一個結點 delete p; p=q; } L->next=NULL; }
求表的長度(從首元結點開始算,頭結點不算)
//求表的長度(從首元結點開始算,頭結點不算) int ListLength(LinkList L){ int length=0; LNode*p; p=L->next; while(p){ length++; p=p->next; } return length; }
取值(取第i個元素)
//取值(取第i個元素) bool GetElem(LinkList L,int i,int &e){ LNode *p; //指標p指向當前掃描到的結點 int j=1; //當前p指向的是第幾個結點 p=L->next; //初始化,p指向首元結點 while(p && j<i)//向後掃描,直到p指向第i個元素或p為空 { p=p->next; ++j; } if(!p || j>i) return false; //i值不合法i>n或i≤0 e=p->data; return true; }
遍歷
// 遍歷 void PrintList(LinkList L){ for(int i=0;i<ListLength(L);i++){ int e; GetElem(L,i+1,e); printf("第%d個元素的值=%d\n",i+1,e); } }
按值查詢---返回指向包含這個值的結點的指標
//按值查詢---返回指向包含這個值的結點的指標 LNode *LocateElem(LinkList L,int e){ LNode *p=L->next; //從第1個結點開始查詢資料域為e的結點 while(p && p->data!=e) p=p->next; return p; //找到後返回該結點指標,否則返回NULL }
按值查詢---返回包含這個值的結點的位置序號
//按值查詢---返回包含這個值的結點的位置序號 int Locate(LinkList L,int e){ LNode *p=L->next; int i=1; while(p && p->data!=e){ p=p->next;i++; } if(p) return i; else return -1; //沒有找到返回-1 }
在第i個位置插入元素e
//在第i個位置插入元素e bool ListInsert(LinkList &L,int i,int e){ LNode *p=L; //p指向頭結點 int j=0; while(p && j<i-1){ //查詢第i-1個結點,p指向該結點 p=p->next;++j; } if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法 LNode *s=new LNode; s->data=e; s->next=p->next; p->next=s; //將新結點s連到p之後 return true; //插入成功 }
刪除第i個元素
//刪除第i個元素 bool ListDelete(LinkList &L,int i, int &e){ LNode *p=L;int j=0; while(p->next && j<i-1){ //查詢第i-1個結點,p指向該結點 p=p->next;++j; } if(!(p->next) || j>i-1) return false; //i>n或i<1,刪除位置不合法 LNode *q=p->next;//令q指向被刪除結點 e=q->data; //用e返回元素的值 p->next=q->next; //改變刪除結點前驅結點的指標域 delete(q); return true; }
頭插法建立單鏈表(逆序排序)
//頭插法建立單鏈表(逆序排序) void CreateList_H(LinkList &L,int n){ L=new LNode; //新建頭結點 L->next=NULL; for(int i=0;i<n;++i){ LNode *p=new LNode; printf("請輸入第%d個值:",i+1); scanf("%d",&p->data); p->next=L->next; //插入到表頭 L->next=p; } }
尾插法建立單鏈表(順序排序)
//尾插法建立單鏈表(順序排序) void CreateList_R(LinkList &L,int n){ L=new LNode;//新建頭結點 L->next=NULL; LNode *r=L; //尾指標:最開始指向頭結點,然後慢慢向後移 for(int i=0;i<n;++i){ LNode *p=new LNode; printf("請輸入第%d個值:",i+1); scanf("%d",&p->data); p->next=NULL; r->next=p; //新結點插入到表尾 r=p; //尾指標r指向新的尾結點 } }
整個程式程式碼
#include<stdio.h> //定義單鏈表結點型別 typedef struct LNode{ int data; //結點的資料域 LNode *next; //結點的指標域 }LNode, *LinkList; //LinkList為指向結構體LNode的指標型別 //單鏈表的初始化 void InitList(LinkList &L){ L=new LNode;//分配一個頭結點 或L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; } //判斷連結串列是否為空 bool ListEmpty(LinkList L){ if(L->next==NULL) //判斷頭結點指標域是否為空 return true; else return false; } //銷燬單鏈表 void DestroyList(LinkList &L){ LNode *p;//或LinkList p; while(L){ p=L; L=L->next; delete p; } } //清空單鏈表(只留頭結點) void ClearList(LinkList &L){ LNode *p,*q;//或LinkList p,q; p=L->next; //p指向要刪除的結點 while(p){ q=p->next; //q指向要刪除的下一個結點 delete p; p=q; } L->next=NULL; } //求表的長度(從首元結點開始算,頭結點不算) int ListLength(LinkList L){ int length=0; LNode *p; p=L->next; while(p){ length++; p=p->next; } return length; } //取值(取第i個元素) bool GetElem(LinkList L,int i,int &e){ LNode *p; //指標p指向當前掃描到的結點 int j=1; //當前p指向的是第幾個結點 p=L->next; //初始化,p指向首元結點 while(p && j<i)//向後掃描,直到p指向第i個元素或p為空 { p=p->next; ++j; } if(!p || j>i) return false; //i值不合法i>n或i≤0 e=p->data; return true; } // 遍歷 void PrintList(LinkList L){ for(int i=0;i<ListLength(L);i++){ int e; GetElem(L,i+1,e); printf("第%d個元素的值=%d\n",i+1,e); } } //按值查詢---返回指向包含這個值的結點的指標 LNode *LocateElem(LinkList L,int e){ LNode *p=L->next; //從第1個結點開始查詢資料域為e的結點 while(p && p->data!=e) p=p->next; return p; //找到後返回該結點指標,否則返回NULL } //按值查詢---返回包含這個值的結點的位置序號 int Locate(LinkList L,int e){ LNode *p=L->next; int i=1; while(p && p->data!=e){ p=p->next;i++; } if(p) return i; else return -1; //沒有找到返回-1 } //在第i個位置插入元素e bool ListInsert(LinkList &L,int i,int e){ LNode *p=L; //p指向頭結點 int j=0; while(p && j<i-1){ //查詢第i-1個結點,p指向該結點 p=p->next;++j; } if(!p || j>i-1) return false; //i>n+1或i<1,插入位置不合法 LNode *s=new LNode; s->data=e; s->next=p->next; p->next=s; //將新結點s連到p之後 return true; //插入成功 } //刪除第i個元素 bool ListDelete(LinkList &L,int i, int &e){ LNode *p=L;int j=0; while(p->next && j<i-1){ //查詢第i-1個結點,p指向該結點 p=p->next;++j; } if(!(p->next) || j>i-1) return false; //i>n或i<1,刪除位置不合法 LNode *q=p->next;//令q指向被刪除結點 e=q->data; //用e返回元素的值 p->next=q->next; //改變刪除結點前驅結點的指標域 delete(q); return true; } //頭插法建立單鏈表(逆序排序) void CreateList_H(LinkList &L,int n){ L=new LNode; //新建頭結點 L->next=NULL; for(int i=0;i<n;++i){ LNode *p=new LNode; printf("請輸入第%d個值:",i+1); scanf("%d",&p->data); p->next=L->next; //插入到表頭 L->next=p; } } //尾插法建立單鏈表(順序排序) void CreateList_R(LinkList &L,int n){ L=new LNode;//新建頭結點 L->next=NULL; LNode *r=L; //尾指標:最開始指向頭結點,然後慢慢向後移 for(int i=0;i<n;++i){ LNode *p=new LNode; printf("請輸入第%d個值:",i+1); scanf("%d",&p->data); p->next=NULL; r->next=p; //新結點插入到表尾 r=p; //尾指標r指向新的尾結點 } } int main(){ LinkList L; //初始化 InitList(L); //尾插法建立單鏈表 CreateList_R(L,5); //插入5個元素 printf("*******************\n"); //求表長 printf("表的長度=%d\n",ListLength(L)); //遍歷 PrintList(L); printf("*******************\n"); //查詢 printf("值為4的結點位置序號=%d\n", Locate(L,4)); printf("驗證:值為4的結點的資料域=%d\n", LocateElem(L,4)->data); printf("*******************\n"); //取值(取第i個元素) int e; GetElem(L,2,e); printf("第2個元素的值=%d\n",e); printf("*******************\n"); //在第i個位置插入元素e ListInsert(L,6,6); printf("表的長度=%d\n",ListLength(L)); PrintList(L); printf("*******************\n"); //刪除第4個元素 int k; ListDelete(L,4,k); printf("表的長度=%d\n",ListLength(L)); printf("被刪除的第4個元素的值=%d\n",k); PrintList(L); }