數據結構(二)線性表——鏈表
阿新 • • 發佈:2017-05-10
erro urn 找到 頭結點 tee 存在 結構 strong 函數
通常情況下,鏈接可分為單鏈表、雙向鏈表和循環鏈表三種常用類型。
一、單鏈表基本操作的實現
使用鏈式存儲結構來實現的線性表稱為鏈表。首元結點、頭結點、頭指針、空指針。
1.單鏈表的類型定義
typedef struct LNode//結點類型 { LElemType data;//數據域 struct LNode * next;//指針域 } LNode, * LinkList;
2.初始化操作InitLinkList(&L)
Status InitLinkList(LinkList &L) { //創建空的帶頭結點的單鏈表L L=(LinkList)malloc(sizeof(LNode));//申請頭結點 if(!F) return OVERFLOW;//若失敗 L->next=NULL;//頭結點的後繼指針域賦為NULL return OK; }
3.求表長操作listLength(&L)
int listLength(LinkList L) { LNode *p=L;//p指向頭結點 int j=0; while(p->next)//當存在 { p=p->next;//指針後移,指向後繼 j++; } return j;//返回計數器}
4.取元素操作getElem(LinkList L,int i,LElemType &e)
Status getElem(LinkList L,int i,LElemType &e) { LNode *p=L; int j=0; while(j<i&&p->next)//不為i結點,且不為最後一個 { p=p->next;//向後查找 j++; } if(j==i)//若找到 { e=p->data;//由e返回其值 returnOK; } else return ERROR;//若沒找到,返回ERROR }
5.按值查找locateElem(L,e)
LinkList locateElem(LinkList L,LElemType e) { LNode *p=L->next;//p指向第一個結點 while(p&&!equal(p->data,e))//若不等於e p=p->next;//向後查找 if(p) return p;//找到 else return NULL;//沒找到 }
6.插入操作listInsert(&L,i,e)
Status listInsert(LinkList &L,int i,LElemType e) { //在單鏈表L的第i個位置插入一個值為e的結點 LNode *p=L,*q;//q用於指向想要插入的結點 int j=0; while(j<i-1&&p->next) { p=p->next; j++; } if(j==i-1)//在j後插入新結點 { q=(LNode *)malloc(sizeof(LNode));//生成新結點 if(!q) return OVERFLOW; q->data=e; q->next=p->next; p->next=q; return OK; } else return ERROR; }
7.刪除操作listDelete(&L,i,&e)
Status listDelete(LinkList &L,int i,LElemType &e) { LNode *p=L,*q; int j=0; while(j<i-1&&p->next) { p=p->next; j++; } if(j==i-1&&p->next)//判斷i結點是否存在 { q=p->next; p->next=q->next; e=q->data;//由e返回刪除元素的值 free(q); } else return ERROR; }
8.頭插法建立單鏈表操作createList(&L,n)
void createList(LinkList &L,int n) { //依次讀入n個元素,建立單鏈表L LNode *p; int i; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=1;i<=n;i++) { p=(LNode *)malloc(sizeof(LNode));//生成p結點 inputListElem(p->data);//調用元素讀入函數 p->next=L->next; L->next=P; } }
9.尾插法建立單鏈表操作createList(&L,n)
void createList(LinkList &L,int n) { //依次讀入n個元素,建立單鏈表L LNode *p,*r; int i; L=(LinkList)malloc(sizeof(LNode));//生成頭結點 r=L;//尾指針r指向頭結點 for(i=1;i<=n;i++) { p=(LNode *)malloc(sizeof(LNode));//生成p結點 inputListElem(p->data);//調用元素讀入函數,讀入p結點的值 r->next=p;//把p結點放到r結點後,尾 r=p; //重置r } r->next=NULL; //最後一個結點後繼指針為空 }
二、單鏈表實例——約瑟夫環問題
1.問題描述:
設編號為1、2、3...、n的n個人圍坐一圈,約定從編號為k(1=<k=<n)的人開始從1報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的人出列,以此類推,直到所有人都出列為止,由此產生一個編號序列。
2.算法描述:
數據結構(二)線性表——鏈表