双链表的含义就是链表结构体中有两个指针域,一个指向前一个结点,另外一个指向后一个结点。下面的代码是对循环双链表的操做练习。数据结构
#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"); }