#include <stdio.h>
#include <stdlib.h> typedef int ElemType; typedef struct DLNode{
ElemType data;
struct DLNode *next;
struct DLNode *prior;
}DLNode; DLNode *InitList(DLNode *DL);//初始化
int ListEmpty(DLNode *DL);//判空
int ListLength(DLNode *DL);//返回链表长度
int ListInsert(DLNode *DL, int i, ElemType e);//插入元素
int ListDelete(DLNode *DL, int i);//删除第i个元素
void TraverseList(DLNode *DL);//遍历线性表 //初始化
DLNode* InitList(DLNode *DL){
int x;
DLNode *p = NULL;
DLNode *r = NULL; DL = (DLNode *)malloc(sizeof(DLNode));
DL->next = DL;
DL->prior = DL;
r = DL; printf("输入直到-1为止\n");
while(){
scanf("%d", &x);
if(x == -){
printf("初始化成功\n");
break;
}
p = (DLNode *)malloc(sizeof(DLNode));
if(p){
p->data = x;
p->prior = r;
p->next = DL;
r->next = p;
DL->prior = p;
r = p;
}else{
printf("空间不足初始化失败\n");
return NULL;
} }
return DL; } //判空
int ListEmpty(DLNode *DL){
return (DL->next == DL);
} //插入元素
int ListInsert(DLNode *DL, int i, ElemType e){
if(i>ListLength(DL)+ || i<=){
printf("插入位置有误,插入失败\n");
return ;
}
DLNode *p = DL;
int j = ;
while(j<i){
p = p->next;
j++;
} DLNode *nDLNode = (DLNode *)malloc(sizeof(DLNode));
nDLNode->data = e;
nDLNode->prior = p->prior;
p->prior->next = nDLNode;
p->prior = nDLNode;
nDLNode->next = p;
printf("插入成功\n");
return ;
} //删除第i个元素
int ListDelete(DLNode *DL, int i){
if(i>ListLength(DL) || i<=){
printf("删除位置有误,插入失败\n");
return ;
}
DLNode *p = DL;
int j = ;
while(j<i){
p = p->next;
j++;
}
p->prior->next = p->next;
p->next->prior = p->prior; free(p);
printf("删除成功\n");
return ;
} //返回链表长度
int ListLength(DLNode *DL){
int len = ;
if(ListEmpty(DL)) return ;
DLNode *p = DL->next;
while(p->data!=DL->data){
len++;
p = p->next;
}
return len;
} //遍历线性表
void TraverseList(DLNode *DL){
if(ListEmpty(DL)){
printf("空链表");
}
DLNode *p = DL->next;
//终止循环遍历
while(p->data != DL->data){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} int main(){
ElemType e = NULL;
DLNode *DL = NULL; //初始化测试
DL = InitList(DL); // //等价测试
// DLNode *d = DL->next->next;
// if(d->next->prior == d->prior->next){
// printf("d->next->prior == d->prior->next\n");
// }
// if(d->next->prior == d){
// printf("d->next->prior == d\n");
// }
// if(d == d->prior->next){
// printf("d == d->prior->next\n");
// } //遍历测试
TraverseList(DL);
//
// printf("双向循环链表长度为%d\n",ListLength(DL)); //插入元素测试
printf("第3个位置插入999\n");
ListInsert(DL, , );
TraverseList(DL);
//-----------------------------------------------------
//非法操作?循环双向链表插入一个巨大的位置是否合法?
//和老师讨论完,算不合法
printf("第567位置插入999\n");
ListInsert(DL, , );
TraverseList(DL);
//------------------------------------------------------
//删除元素测试
// printf("删除第1个位置\n");
// ListDelete(DL, 1);
// TraverseList(DL);
//------------------------------------------------------
//非法操作?同上
//新问题,1,2,3,4,-1,删除第5个是头节点。
//和老师讨论完,算不合法
// printf("删除第55位置\n");
// ListDelete(DL, 55);
// TraverseList(DL);
//------------------------------------------------------ }

纯C语言实现循环双向链表创建,插入和删除的更多相关文章

  1. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  2. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  3. C语言链表的建立、插入和删除

    先看下向链表中插入节点 下面这个是删除链表节点

  4. C语言双链表遍历,插入,删除

    #include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memse ...

  5. Problem A: C语言习题 链表建立,插入,删除,输出

    #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct student { l ...

  6. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...

  7. 循环双向链表-C语言实现

    直接贴出完整代码,每个函数的功能及部分代码的解释都在注释中,代码亲测可行 /* 2018.8.15 注意三点: 1.不要将循环写成if //很尴尬,主要是我犯了这个错误,找了半天还没找出来,第二天看的 ...

  8. Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程

    10-9. 在多对多关系中为插入和删除使用存储过程 问题 想要在一个无载荷的多对多关系中使用存储过程(存储过程只影响关系的连接表) 解决方案 假设有一个多对多关系的作者( Author)表和书籍( B ...

  9. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...

随机推荐

  1. HTML颜色名称大全

    所有浏览器支持的颜色名称,所有现代浏览器都支持以下140种颜色名称(单击颜色名称或十六进制值,以将颜色视为背景颜色以及不同的文本颜色): 有关HTML颜色的完整概述,请访问我们的颜色教程. 颜色名称 ...

  2. arcgis api for javascript 学习(六) 地图打印

    1.本文应用arcgis api for javascript对发布的动态地图进行打印,打印的为PDF格式,打印出来如图: 2.需要特别注意的是:我们在运行代码前,需要打开PrintingTools, ...

  3. Java collection 集合类架构

    https://www.cnblogs.com/fireflyupup/p/4875130.html Collection List 在Collection的基础上引入了有序的概念,位置精确:允许相同 ...

  4. Centos系统配置bond0

    版权声明:本文为博主原创文章,支持原创,转载请附上原文出处链接和本声明. 本文链接地址:https://www.cnblogs.com/wannengachao/p/11942254.html 1.查 ...

  5. 2019 Multi-University Training Contest 1 E Path(最短路+最小割)

    题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...

  6. 【洛谷P3329】 [ZJOI2011]最小割(最小割树)

    洛谷 题意: 给出一个无向图,之后有\(q,q\leq 30\)组询问,每组询问有一个\(x\),回答有多少点对\((a,b)\)其\(a-b\)最小割不超过\(x\). 思路: 这个题做法要最小割树 ...

  7. Jmeter Question 之 ‘批量执行SQL语句’

    第一步: MySql数据库:jdbc:mysql://ip:3306/数据库名?useUnicode=true&characterEncoding=utf8&allowMultiQue ...

  8. SpringCloud学习笔记(十、SpringCloud Sleuth)

    目录: 什么是SpringCloud Sleuth 为什么使用SpringCloud Sleuth 如何使用SpringCloud Sleuth 什么是SpringCloud Sleuth: Spri ...

  9. pwn-pwn2

    环境说明 Ubuntu 16.04 pwntool IDA gdb-peda 先丢到Ubuntu看看文件的类型  64位 然后看看保护机制,发现没有保护机制 然后丢到IDA看看  F5查看伪代码 ma ...

  10. MySQL学习笔记2——DML

    DML(数据操作语言,它是对表记录的操作(增,删,改)!) 1.插入数据 *INSERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2,...); >在表名后给出要插入 ...