纯C语言实现循环双向链表创建,插入和删除
#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语言实现循环双向链表创建,插入和删除的更多相关文章
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
- YTU 2430: C语言习题 链表建立,插入,删除,输出
2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 576 解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...
- C语言链表的建立、插入和删除
先看下向链表中插入节点 下面这个是删除链表节点
- C语言双链表遍历,插入,删除
#include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memse ...
- Problem A: C语言习题 链表建立,插入,删除,输出
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct student { l ...
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循环的链表,通过每个节点的两个指针把它们扣在一起组成一个环状.所以呢,每个节点都有前驱节点和后继节点(包括头节点和 ...
- 循环双向链表-C语言实现
直接贴出完整代码,每个函数的功能及部分代码的解释都在注释中,代码亲测可行 /* 2018.8.15 注意三点: 1.不要将循环写成if //很尴尬,主要是我犯了这个错误,找了半天还没找出来,第二天看的 ...
- Entity Framework 6 Recipes 2nd Edition(10-9)译 -> 在多对多关系中为插入和删除使用存储过程
10-9. 在多对多关系中为插入和删除使用存储过程 问题 想要在一个无载荷的多对多关系中使用存储过程(存储过程只影响关系的连接表) 解决方案 假设有一个多对多关系的作者( Author)表和书籍( B ...
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...
随机推荐
- JavaScript HTML DOM Style flexWrap 属性
flexWrap 属性 flexWrap属性指定flex项是否应该换行. 注意:如果元素不是flex项,则flexWrap属性不起作用. 如果必要,使flex换行: document.getEleme ...
- 远程连接docker
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix: ...
- 配置flutter For IOS
https://www.cnblogs.com/lovestarfish/p/10628205.html 第一步,下载flutter最新版,解压到自己的目录里: 提供网址:https://flutte ...
- Ubuntu 镜像制作 官方教程
rufus工具下载:下载链接 官方教程:官方教程链接 软件界面预览: 资源来源自网络,如果对您有帮助,请点击推荐~. 我尝试了这个方法可以用.电脑重启时,选择从U盘启动,就能安装系统. 参考链接: h ...
- Python继承、多继承、魔术方法
继承和多继承的概念和使用 super的用法 __str__ __repr__ __call__ 多继承方法解析顺序和Mix-in开发模式 魔术方法原理和作用 继承 定义类的时候,在类名后面的括号里填继 ...
- Centos7安装配置----1配置网络
1.下载镜像安装,选择的是最小安装,设置root用户密码 (此处省略其中步骤,直到安装成功) 2.安装完成后重启,输入用户名密码进入系统 由于此时未配置网络,所以网卡什么的均未获取ip联网 输入ip ...
- SSDB数据库笔记
目录 环境 配置文件 启动服务器 客户端 SSDB:一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 参考文献: SSDB官网 环境 win10 下 wsl 环境 ubun ...
- selenium中driver.close()和driver.quit()的不同点
driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...
- Spring Cloud Alibaba Sentinel对Feign的支持
Spring Cloud Alibaba Sentinel 除了对 RestTemplate 做了支持,同样对于 Feign 也做了支持,如果我们要从 Hystrix 切换到 Sentinel 是非常 ...
- jenkins报错 Host key verification failed.
一.Host key verification failed 问题描述 在本地windows机器上安装了jenkins,在git bash命令行窗口可以使用git pull命令,但是在jenkins ...