c語言實現連結串列及其基本操作
阿新 • • 發佈:2019-02-16
介紹
連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。
和順序表的區別:
順序表使用陣列儲存線形的元素,其特點是可以隨機存取,但是,因為邏輯上相鄰的元素物理上也相鄰,所以插入刪除需要移動元素。連結串列使用指標連結串列示線形表元素的邏輯關係,插入和刪除只需修改指標,不能隨機存取。
程式碼實現
typedef int DataType; typedef struct Node {//結構實現 DataType data; struct Node* next; }Node, *PNode;
void InitList(PNode* PHead)//初始化 { assert(PHead); *PHead = NULL; } PNode ByeNode(DataType data)//申請一個結點 { PNode newNode = NULL; newNode = (PNode)malloc(sizeof(Node)); if (NULL == newNode) { printf("out of memory.\n"); exit(1); } else { newNode->data = data; newNode->next = NULL; } return newNode; } void PopBack(PNode* PHead)//尾刪 { assert(PHead); if (NULL == *PHead) { return; } else if(NULL == (*PHead)->next) { PNode TempNode = *PHead; free(TempNode); TempNode = NULL; *PHead = NULL; } else { PNode PCur = *PHead; while (PCur->next->next) { PCur = PCur->next; } PCur->next = NULL; } } void PushBack(PNode* PHead, DataType data)//尾插 { assert(PHead); if (NULL == *PHead) { *PHead = ByeNode(data); } else { PNode PCur = NULL; PCur = *PHead; while (PCur->next) { PCur = PCur->next; } PCur->next = ByeNode(data); } } void PushFront(PNode *PHead, DataType data)//頭插 { assert(PHead); PNode PreNode = NULL; PNode Node = ByeNode(data); PreNode = *PHead; Node->next = PreNode; *PHead = Node; } void PopFront(PNode *PHead)//頭刪 { assert(PHead); PNode PreNode = *PHead; if (NULL == *PHead) { return; } else if (NULL == (*PHead)->next) { *PHead = NULL; } else { *PHead = PreNode->next; free(PreNode); PreNode = NULL; } }
PNode Find(PNode* PHead, DataType data)//查詢 { assert(PHead); PNode PCur = *PHead; while (PCur) { if (data == PCur->data) break; PCur = PCur->next; } return PCur; } void Destroy(PNode* PHead)//銷燬 { assert(PHead); PNode PCur = *PHead; while (PCur->next) { PNode Dnode = PCur; PCur = PCur->next; free(Dnode); Dnode = NULL; } } int Empty(PNode PHead)//判空 { if (NULL == PHead) return 0; else return 1; } int Size(PNode PHead)//求連結串列中結點的個數 { PNode Node = PHead; DataType num = 0; while (Node) { num++; Node = Node->next; } return num; } void PrintList(PNode* PHead)//列印單鏈表 { PNode PCur = *PHead; assert(PHead); while (PCur) { printf("%d->",PCur->data); PCur = PCur->next; } printf("NULL\n"); } void Insert(PNode pos, DataType data)//在data後插入結點 { PNode newNode = ByeNode(data); PNode PreNode = pos; newNode->next = PreNode->next; PreNode->next = newNode; }