版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/lady_killer9/article/details/82700743
今天是單鏈表的實現,主要實現函數如下:
- InitList(LinkList &L) 參數:單鏈表L 功能:初始化 時間復雜度 O(1)
- ListLength(LinkList L) 參數:單鏈表L 功能:獲得單鏈表長度 時間復雜度O(n)
- ListInsert(LinkList &L,int i,ElemType e) 參數:單鏈表L,位置i,元素e 功能:位置i后插 時間復雜度O(n)[加入了查找]
- 若已知指針p指向的后插 O(1)
- ListDelete(LinkList &L,int i) 參數:單鏈表L,位置i 功能:刪除位置i元素 時間復雜度O(n)[加入了查找]
- 若已知p指針指向的刪除 最好是O(1),因為可以與后繼結點交換數據域,然后刪除后繼結點。
- 最壞是O(n),即從頭查找p之前的結點,然后刪除p所指結點
- LocateElem(LinkList L,ElemType e) 參數:單鏈表L,元素e 功能:查找第一個等於e的元素,返回指針 時間復雜度O(n)
代碼:
/* Project: single linkeed list (數據結構 單鏈表) Date: 2018/09/14 Author: Frank Yu InitList(LinkList &L) 參數:單鏈表L 功能:初始化 時間復雜度 O(1) ListLength(LinkList L) 參數:單鏈表L 功能:獲得單鏈表長度 時間復雜度O(n) ListInsert(LinkList &L,int i,ElemType e) 參數:單鏈表L,位置i,元素e 功能:位置i后插 時間復雜度O(n)[加入了查找] 若已知指針p指向的后插 O(1) ListDelete(LinkList &L,int i) 參數:單鏈表L,位置i 功能:刪除位置i元素 時間復雜度O(n)[加入了查找] 若已知p指針指向的刪除 最好是O(1),因為可以與后繼結點交換數據域,然后刪除后繼結點。 最壞是O(n),即從頭查找p之前的結點,然后刪除p所指結點 LocateElem(LinkList L,ElemType e) 參數:單鏈表L,元素e 功能:查找第一個等於e的元素,返回指針 時間復雜度O(n) */ #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> using namespace std; #define Status int #define ElemType int //單鏈表結點數據結構 typedef struct LNode { ElemType data;//數據域 struct LNode *next;//指針域 }LNode,*LinkList; //**************************基本操作函數***************************// //初始化函數 Status InitList(LinkList &L) { L = new LNode;//生成頭結點 這樣刪除等操作就不必分第一個結點和其他了 L->next = NULL; return 1; } //獲取單鏈表長度 頭結點無數據,不算 int ListLength(LinkList L) { LinkList p=L;int sum=0; while(p) { sum++; p=p->next; } return sum-1;//去除頭結點 } //插入函數--后插法 插入到第i(1<=i<=length+1)個位置 即i-1之后 不必區分i的位置 bool ListInsert(LinkList &L,int i,ElemType e) { LNode* s;LinkList p=L;int j=0; while(p&&(j<i-1))//j指到i-1位置或者p已經到最后時跳出 { p=p->next; ++j; } if(!p||j>i-1)//i<1或者i>ListLength(L)+1時,插入位置無效 不調用ListLength,提高效率 { printf("插入位置無效!!!\n"); return false; } s=new LNode; s->data=e; s->next=p->next; p->next=s; return true; } //刪除函數 刪除位置i的結點 即刪除i-1之后的結點 bool ListDelete(LinkList &L,int i) { LNode* s;LinkList p=L;int j=0; LinkList q; while(p&&(j<i-1))//j指到i-1位置 { p=p->next; ++j; } if(!(p->next)||j>i-1)//i<1或者i>ListLength(L)時,刪除位置無效 { printf("刪除位置無效!!!\n"); return false; } q=p->next; p->next=q->next; free(q);//釋放空間 return true; } //查找函數 按值查找 查找第一個等於e的結點 成功返回該結點指針,否則返回NULL LNode *LocateElem(LinkList L,ElemType e) { LNode *p=L; while(p&&(p->data!=e)) { p=p->next; } return p; } //**************************功能實現函數**************************// //遍歷輸出函數 void PrintList(LinkList L) { LinkList p=L->next;//跳過頭結點 if(ListLength(L)) { printf("當前單鏈表所有元素:"); while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } else { printf("當前單鏈表已空!\n"); } } //插入功能函數 調用ListInsert后插 void Insert(LinkList &L) { int place;ElemType e;bool flag; printf("請輸入要插入的位置(從1開始)及元素:\n"); scanf("%d%d",&place,&e); flag=ListInsert(L,place,e); if(flag) { printf("插入成功!!!\n"); PrintList(L); } } //刪除功能函數 調用ListDelete刪除 void Delete(LinkList L) { int place;bool flag; printf("請輸入要刪除的位置(從1開始):\n"); scanf("%d",&place); flag=ListDelete(L,place); if(flag) { printf("刪除成功!!!\n"); PrintList(L); } } //查找功能函數 調用LocateElem查找 void Search(LinkList L) { ElemType e;LNode *q; printf("請輸入要查找的值:\n"); scanf("%d",&e); q=LocateElem(L,e); if(q) { printf("找到該元素!\n"); } else printf("未找到該元素!\n"); } //菜單 void menu() { printf("********1.后插 2.刪除*********\n"); printf("********3.查找 4.輸出*********\n"); printf("********5.退出 *********\n"); } //主函數 int main() { LinkList L;int choice; InitList(L); while(1) { menu(); printf("請輸入菜單序號:\n"); scanf("%d",&choice); if(choice==5) break; switch(choice) { case 1:Insert(L);break; case 2:Delete(L);break; case 3:Search(L);break; case 4:PrintList(L);break; default:printf("輸入錯誤!!!\n"); } } return 0; }