雙鏈表的含義就是鏈表結構體中有兩個指針域,一個指向前一個結點,另外一個指向後一個結點。下面的代碼是對循環雙鏈表的操做練習。數據結構
#include <stdio.h> #include <stdlib.h> typedef struct list { char data; struct list *prior; struct list *next; }dlinklist; dlinklist *CreateLinklist_End(); //尾插法建立循環雙鏈表 void ShowLinklist(dlinklist *h); //輸出顯示鏈表 int DLinklist_Insert(dlinklist *h, char dat, int pos); //雙鏈表按指定位置插入結點 int DLinklist_Delete(dlinklist *h, int pos); //雙鏈表按指定位置刪除結點 int main(void) { dlinklist *head; int choice, pos, ans; char dat; printf("循環雙鏈表的操做練習\n"); printf("建立循環雙鏈表,請依次輸入字符數據('#'表示結束):\n"); head = CreateLinklist_End(); while(1) { printf("對雙鏈表操做:\n"); printf("1.在指定位置插入一個結點\n"); printf("2.刪除指定位置的結點\n"); printf("3.輸出顯示鏈表\n"); printf("4.退出程序\n"); printf("作出選擇:\n"); scanf("%d", &choice); getchar(); switch(choice) { //鏈表結點的插入 case 1: printf("請輸入你想插入的字符及位置,空格隔開:\n"); scanf("%c %d", &dat, &pos); ans = DLinklist_Insert(head, dat, pos); if(ans) printf("插入成功!\n"); else printf("插入失敗!\n"); break; //鏈表結點的刪除 case 2: printf("請輸入你想刪除的結點位置:"); scanf("%d", &pos); ans = DLinklist_Delete(head, pos); if(ans) printf("刪除結點成功!\n"); else printf("刪除結點失敗!\n"); break; //輸出顯示鏈表 case 3: ShowLinklist(head); break; //退出程序 case 4: return 0; break; default: printf("選擇無效!\n"); break; } } return 1; } //尾插法建立鏈表 dlinklist *CreateLinklist_End() { dlinklist *head, *p, *e; char ch; head = (dlinklist*)malloc(sizeof(dlinklist)); e = head; ch = getchar(); while(ch != '#') { p = (dlinklist*)malloc(sizeof(dlinklist)); p->data = ch; p->prior = e; e->next = p; e = p; ch = getchar(); } e->next = head; //尾結點的後指針指向頭指針 head->prior = e; //頭指針的前指針指向尾結點 return head; } int DLinklist_Insert(dlinklist *h, char dat, int pos) { dlinklist *p, *s; int i=0; p = h; while(i<pos-1 && p->next != h) //找到指定位置結點的前一個結點 { i++; p = p->next; } if(i != pos-1) return 0; p = p->next; s = (dlinklist*)malloc(sizeof(dlinklist)); s->data = dat; s->prior = p->prior; //核心插入結點操做代碼 p->prior->next = s; s->next = p; p->prior = s; return 1; } //刪除指定位置結點 int DLinklist_Delete(dlinklist *h, int pos) { dlinklist *p; int i = 0; p = h; while(i<pos && p->next!=h) //找到指定位置結點 { i++; p = p->next; } if(i != pos || i == 0) return 0; p->prior->next = p->next; //刪除結點核心代碼 p->next->prior = p->prior; free(p); return 1; } //輸出顯示鏈表 void ShowLinklist(dlinklist *h) { dlinklist *p; p = h->next; while(p != h) { printf("%c ", p->data); p = p->next; } printf("\n"); }