C語言實現連結串列的建立,初始化,插入,刪除,查詢
阿新 • • 發佈:2019-02-18
#include <stdio.h> #include <stdlib.h> #define OK 0 #define ERROR -1 #define MALLOC_ERROR -2 typedef int ElementType; typedef struct node { ElementType data; // 結點的資料 struct node *next; // 結點指標 }Node; typedef Node *PNode; // 重新命名結點指標型別 // 頭插法建立連結串列 //int Create_List_Head(struct node ** head, ElementType data) int Create_List_Head(PNode *h, ElementType data) { // 建立一個新的結點 //struct node * node = (struct node *)malloc(sizeof(Node)/sizeof(char)); PNode p = (PNode)malloc(sizeof(Node)/sizeof(char)); if (p == NULL) { return MALLOC_ERROR; } // 將新資料賦給新結點 p->data = data; p->next = *h; *h = p; } // 尾插法建立連結串列 int Create_List_Tail(PNode *h, ElementType data) { PNode node = (PNode)malloc(sizeof(Node)/sizeof(char)); if (node == NULL) { return MALLOC_ERROR; } node->data = data; node->next = NULL; // 將node加入到連結串列最後,此處要考慮是否非空表 if (*h == NULL) // 空表 { *h = node; } else // 非空表 { PNode temp = *h; // 找最後一個結點 while (temp->next) { temp = temp->next; } temp->next = node; } return OK; } // 在第 pos 個結點處插入一個數據 int Insert_Node(PNode *h, int pos, ElementType data) { PNode temp = *h; int k=1; // 找第pos-1個結點 while (temp && k < pos-1) { temp=temp->next; k++; } // 非空表 if (temp == NULL && *h != NULL) { printf ("給的位置無效\n"); return ERROR; } // 新建結點 PNode node = (PNode)malloc(sizeof(Node)/sizeof(char)); if (node == NULL) { return MALLOC_ERROR; } node->data = data; // 將結點插入到連結串列中 if (*h == NULL || pos == 1) // 插在表前 { node->next = *h; *h = node; } else // 插在表中或末尾 { node->next = temp->next; temp->next = node; } return OK; } // 將第 pos 個結點刪除 int Delete_Node(PNode *h, int pos) { if (*h == NULL) { printf ("空表,無法刪除資料\n"); return ERROR; } PNode p = *h; int k = 1; while (p && k < pos-1) { p = p->next; k++; } if (p == NULL || k >= pos-1) { printf ("無效的結點\n"); return ERROR; } PNode temp = p; if (pos == 1) { *h = p->next; } else { temp = p->next; p->next = temp->next; } free(temp); temp = NULL; return OK; } //連結串列逆序 int Inverse_List(PNode *h) { //如果是空連結串列或者只有一個節點的連結串列預設已經逆序 if (*h == NULL ||(*h)->next == NULL) { return OK; } PNode pre = *h; PNode cur = pre->next; PNode next = NULL; //將各個結點逆序 while (cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } //處理尾指標和結點 (*h)->next = NULL; *h = pre; return OK; } // 列印 void DisPlay(PNode head) { if (head == NULL) { printf ("該連結串列是空表!\n"); return; } PNode temp = head; while (temp) { printf ("%4d", temp->data); temp = temp->next; } printf ("\n"); } int main() { PNode head = NULL; // 頭插法建立連結串列 int i = 0; for (i = 0; i < 10; i++) { // 頭插法建立連結串列 /* if (Create_List_Head(&head, i) != OK) { return ERROR; } */ // 尾插法建立連結串列 if (Create_List_Tail(&head, i) != OK) { return ERROR; } } DisPlay(head); // 在第 pos 個結點處插入一個數據 /* if(Insert_Node(&head, 1, 11) != OK) { return ERROR; } DisPlay(head); */ // 將第 pos 個結點刪除 if(Delete_Node(&head, 19) != OK) { return ERROR; } DisPlay(head); return 0; }