数据结构学习(五)——循环双链表的操作之创建,插入、删除

来源:互联网 发布:香港有没有网络教肓 编辑:程序博客网 时间:2024/05/16 07:44

双链表的含义就是链表结构体中有两个指针域,一个指向前一个结点,另一个指向后一个结点。下面的代码是对循环双链表的操作练习。

#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");elseprintf("插入失败!\n");break;//链表结点的删除case 2:printf("请输入你想删除的结点位置:");scanf("%d", &pos);ans = DLinklist_Delete(head, pos);if(ans)printf("删除结点成功!\n");elseprintf("删除结点失败!\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");}

下面学习的就是另外一种数据结构了——队列微笑