纯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语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...
随机推荐
- 易优CMS:type的基础用法
[基础用法] 名称:type 功能:获取指定栏目信息 语法: {eyou:type typeid='栏目ID' empty='暂时没有数据'} <a href="{$field.typ ...
- python的几个实例程序员节日快乐
python的几个小实例 有参函数 def login(username, password): name = input("请输入您的姓名").strip() pwd = inp ...
- docker容器跨服务器的迁移的方法
docker的备份方式有export和save两种. export是当前的状态,针对的是容器,docker save 是针对镜像images. export 找出要备份容器的ID ? 1 2 3 [r ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- 初学JavaScript正则表达式(四)
字符类 [] 一般情况下正则表达式中一个字符对应字符串一个字符 可以使用元字符 [ ] 来构建一个简单的类 类泛指符合某些特征的对象 例: 'a1b1c1d1'.replace(/[ab ...
- vue组件name的作用小结
我们在写vue项目的时候会遇到给组件命名 这里的name非必选项,看起来好像没啥用处,但是实际上这里用处还挺多的 ? 1 2 3 export default { name:'xxx' } 1. ...
- **目录找出最后一次修改的文件(html结果),发送报告到指定qq邮箱
import unittest,HTMLTestRunnerimport osdef runa(): path=os.getcwd() print(path) a=unittest.defaultTe ...
- c# 第41节 异常处理
本节内容: 1:捕获异常两种方式 2:处理异常的两种方式 3:实例处理异常 4:手动触发异常 5:预定义异常类有哪些 6:自定义异常 1:捕获异常 第一种 捕获:只能知道发生了异常 第二种捕获: 可以 ...
- 剑指Offer-9.变态跳台阶(C++/Java)
题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设我们要求跳上第3级的跳法,可以从第0级跳3级台阶到达,也可以从第1级 ...
- CF1146D Frog Jumping
CF1146D Frog Jumping 洛谷评测传送门 题目描述 A frog is initially at position 00 on the number line. The frog ha ...