C語言實現雙鏈表的建立、插入、刪除、查詢

效果圖:

C語言實現雙鏈表的建立、插入、刪除、查詢

開發工具:

C語言實現雙鏈表的建立、插入、刪除、查詢

程式碼:

#pragma clang diagnostic push#pragma ide diagnostic ignored “cert-err34-c”#include #include /** * 雙鏈表的實現 */typedef int ElementType;/** * 定義雙鏈表結點結構體 */typedef struct DNode { ElementType data; struct DNode *prior, *next;} DNode, *DLinkList;//取兩個別名,一個為指向這個結構體的指標型別/** * 函式宣告 */DLinkList CreatLinkList(DLinkList L);void InsertElement(DLinkList L, int position, int element);void printLinkList(DLinkList L);DLinkList InitLinkList(DLinkList L);int Length(DLinkList L);DLinkList GetElement(DLinkList L, int position);void DeleteElement(DLinkList L, int position);void Menu();int main() { DNode L; L = *InitLinkList(&L); Menu(); int token, element, position;//定義令牌 scanf(“%d”, &token); while (token != 0) { if (token == 1) { CreatLinkList(&L); } if (token == 2) { printLinkList(&L); } if (token == 3) { int length = Length(&L); printf(“表長為%d\n”, length); } if (token == 4) { printf(“輸入查詢的位置\n”); scanf(“%d”, &position); DLinkList node = GetElement(&L, position); printf(“查詢到元素為%d\n”, node->data); } if (token == 5) { printf(“輸入插入的位置\n”); scanf(“%d”, &position); printf(“輸入插入的元素值\n”); scanf(“%d”, &element); InsertElement(&L, position, element); } if (token == 6) { printf(“輸入刪除的位置\n”); scanf(“%d”, &position); DeleteElement(&L, position); } Menu(); scanf(“%d”, &token); } return 0;}/** * 建立雙鏈表 */DLinkList CreatLinkList(DLinkList L) { DNode *s; int x; printf(“請輸入結點的值:\n”); scanf(“%d”, &x); while (x != 9999) { s = (DLinkList) malloc(sizeof(DNode)); s->data = x; s->next = L->next; if (L->next != NULL) { L->next->prior = s; } s->prior = L; L->next = s; printf(“請繼續輸入結點的值,或者輸入“9999”結束插入元素\n”); scanf(“%d”, &x); } return L;}/** * 列印連結串列 */void printLinkList(DLinkList L) { if (L == NULL) { printf(“連結串列為空\n”); return; } DNode *p; p = L->next; printf(“當前元素為;”); while (p) { printf(“%d ”, p->data); p = p->next; } printf(“\n”);}/** * 插入元素 */void InsertElement(DLinkList L, int position, int element) { if (position < 0 || position > Length(L) + 1) { printf(“位置不合法\n”); return; } else { DNode *s, *p; s = (DLinkList) malloc(sizeof(DNode)); s->data = element; p = GetElement(L, position); p = p->prior; s->next = p->next; p->next->prior = s; p->next = s; s->prior = p; }}/** * 選單 */void Menu() { printf(“***********1。頭插法建立連結串列 2。列印連結串列***********\n”); printf(“***********3。求表長度 4。按位查詢元素***********\n”); printf(“***********5。插入元素 6。刪除元素***********\n”);}/** * 初始化連結串列 */DLinkList InitLinkList(DLinkList L) { L = (DLinkList) malloc(sizeof(DNode));//給頭結點分配空間 L->next = NULL;//讓頭節點的next置空 L->prior = L;//前驅指標指向連結串列自己 printf(“初始化成功\n”); return L;}/** * 求表長 */int Length(DLinkList L) { int counter = 0; DNode *p; p = L->next; while (p) { counter++; p = p->next; } return counter;}/** * 按位查詢 */DLinkList GetElement(DLinkList L, int position) { if (position < 0 || position > Length(L) + 1) { printf(“查詢位置無效\n”); return L; } else { DNode *p; p = L->next; int counter = 1; while (p && counter < position) { p = p->next; counter++; } return p; }}/** * 刪除元素 */void DeleteElement(DLinkList L, int position) { if (position < 1 || position > Length(L) + 1) { printf(“位置不合法\n”); return; } DNode *p, *s; p = GetElement(L, position); s = p->prior; s->next = p->next; p->next->prior = s; free(p);}#pragma clang diagnostic pop

TAG: DLinkListpositionNEXTprintfint