1. 程式人生 > >《資料結構與演算法》-單鏈表基本操作的C語言實現

《資料結構與演算法》-單鏈表基本操作的C語言實現

最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。
所用教材《資料結構與演算法分析》by Mark Allen Weiss
《資料結構》(C語言版) by嚴蔚敏

#include <stdio.h>
#include <stdlib.h>
#include "List.h"
//首先一些預定義:
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List
; typedef PtrToNode Position; //定義一個結構體,表示一個結點 struct Node{ ElementType Element; Position Next;//Position表示strut Node*; }; /* *測試一個連結串列是否為空的函式 *返回true為空,false非空 */ int IsEmpty(List L) { return L->Next==NULL; } /* *測試當前位置是否為連結串列的末尾 *返回true表示是末尾,false表示不是末尾 */ int IsLast(Position P,List L) { return
P->Next==NULL; } /* *返回某個元素在表中的位置 *返回NULL表示沒找到 */ Position Find(ElementType X,List L) { Position P; P=L->Next; while(P!=NULL&&P->Element!=X) P=P->Next; return P; } /* *函式名 : CreateList() *函式功能描述 : 創造一個n(不包括頭結點)個結點的單鏈表 *函式引數 : List L單鏈表頭結點 int n節點個數 *函式返回值 :void *作者 : Tengyuan *函式建立日期 : 2016.3.10 *備註:宣告一個指向結構的指標並不建立該結構,只是預留了儲存空間;而malloc函式會建立結構並返回指向該結構的指標。 */
void CreateList(List L,int n) { int i; for(i=0;i<n;++i) { List P=(List)malloc(sizeof(struct Node)); P->Next=NULL; scanf("%d",&(P->Element)); L->Next=P;//把結點P接到連結串列L後面 L=P;//此時連結串列從P後面接入結點 } } /* *列印連結串列中的元素 */ void ListPrint(List L) { struct Node *P=L->Next; while(P!=NULL) { printf("%3d",P->Element); P=P->Next; } } /* *返回元素X在L中前驅位置 */ Position FindPrevious(ElementType X,List L) { Position P; P=L; while(P->Next!=NULL && P->Next->Element!=X) { P=P->Next; } return P; } void Delete(ElementType X,List L) { Position P,Ptr; // P=FindPrevious(X,L);//刪除第一次出現的X值 // if(!IsLast(P,L)) // { // Ptr=P->Next; // P->Next=Ptr->Next; // free(Ptr); // } P=FindPrevious(X,L);//刪除所有出現的X值 while(!IsLast(P,L)) { Ptr=P->Next; P->Next=Ptr->Next; free(Ptr); P=FindPrevious(X,L); } } //在表L中位置P後插入元素X void Insert(ElementType X,List L,Position P) { Position TmpCell; TmpCell=malloc(sizeof(struct Node)); if(TmpCell==NULL) printf("Out of space!!!"); TmpCell->Element=X; TmpCell->Next=P->Next; P->Next=TmpCell; } int main() { List L; L=(List)malloc(sizeof(struct Node));//必須創造一個空間儲存節點L,單獨一個List L並沒有建立頭結點 L->Next=NULL; CreateList(L,4); ListPrint(L); printf("\n"); Delete(5,L); ListPrint(L); printf("\n"); Insert(12,L,L->Next->Next); ListPrint(L); printf("\n"); return 0; }