双向循环链表的插入和删除
2010-06-25 15:51
357 查看
#include<stdio.h>/*双向循环链表的插入和删除,2009年6月29日王红刚*/ #include<stdlib.h> #include <malloc.h> #define ERROR 0 #define OK 1 typedef char ElemType; typedef struct DNode { ElemType data; struct DNode *prior,*next; }DNode,*DoubleList; void CreateList(DoubleList L)/*通过键盘输入表中元素值,利用尾插法建链表*/ { DNode *r, *s; char c; int flag =1; /*设置一个标志,初值为1,当输入"#"时,flag为0,建表结束*/ L->next=L; L->prior=L; r=L; while(flag) { c=getchar(); if(c!='#') { s=(DNode*)malloc(sizeof(DNode)); s->data=c; r->next=s; s->prior=r; r=s; } else { flag=0; r->next=L; L->prior=r; } } /*while*/ } int DlinkIns(DoubleList L,int i,ElemType e) { DNode *s,*p; int k; p=L; k=0; /*从"头"开始,查找第i-1个结点*/ while(p->next!=L&&k<i) /*表未查完且未查到第i-1个时重复,找到p指向第i个*/ { p=p->next; k=k+1; } /*查找第i-1结点*/ if(p->next == L) /*如当前位置p为空表已找完还未数到第i个,说明插入位置不合理*/ { printf("插入位置不合理!"); return ERROR; } s=(DNode*)malloc(sizeof(DNode)); if (s) { s->data=e; s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; return OK; } else return ERROR; } int DlinkDel(DoubleList L,int i) { ElemType e; DNode *p; int k; p=L; k=0; /*从"头"开始,查找第i个结点*/ while(p->next!=L && k<i) /*表未查完且未查到第i个时重复,找到p指向第i个*/ { p=p->next; k=k+1; } if(p->next == L) { return ERROR; } else { e=p->data; p->prior->next=p->next; p->next->prior=p->prior; free(p); return OK; } } void main() { DoubleList l; DNode *p; int i; char e; l=(DNode * )malloc(sizeof(DNode)); printf("请输入双向链表数据!:/n"); CreateList(l); p = l->next; while(p!=l) { printf("%c/n",p->data); p=p->next; } printf("情输入插入位置和元素值:/n"); scanf("%d,%c",&i,&e); getchar(); DlinkIns(l,i,e); printf("插入后的链表为:/n"); p = l->next; while(p!=l) { printf("%c/n",p->data); p=p->next; } printf("请输入删除位置:/n"); scanf("%d",&i); DlinkDel(l,i); printf("删除后的链表为:/n"); p = l->next; while(p!=l) { printf("%c/n",p->data); p=p->next; } }
相关文章推荐
- 数据结构 P36-37 算法实现 双向循环链表的插入与删除
- 双向非循环递增链表——插入,删除,清空
- 2016年12月23日学习总结----双向循环链表操作程序(头插、尾插、中间插入、删除)
- 双向循环链表的插入删除
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- 双向循环链表的建立,插入,删除(不带头结点)
- 双向循环链表 初始化 插入 删除
- 数据结构双向循环链表的C语言实现(插入,查询,删除)
- 双向循环链表的插入与删除
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 数据结构--双向循环链表--插入和删除
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- 双向循环链表的建立,插入,删除(带头节点)
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 双向循环链表的插入和删除
- 双向非循环递增链表——插入,删除,清空
- 编写算法实现建立一个带头结点的含n个元素的双向循环链表H,并在链表H中的第i个位置插入一个元素e
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作