#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define bzero(a, b) memset(a, 0, b)//windows平台下无bzero函数。 增加宏拓展移植性
struct node
{
int data; //有效数据
struct node *pLast;//指向上一个节点的指针
struct node *pNext;//指向下一个节点的指针 };
struct node * make_node(int data)
{
struct node *p=(struct node*)malloc(sizeof(struct node));
if(NULL==p)
{
printf("malloc error\n");
return NULL;
}
//清理申请到的内存
bzero(p,sizeof(struct node));
//填充节点
p->data=data;
p->pLast=NULL;
p->pNext=NULL;//将来要指向下一个节点的首地址
//实际操作时将下一个节点的malloc 返回的指针给他。
return p;
} void ergodic(struct node *pH)//遍历
{
int cnt=;
struct node *p=pH;
/* printf("------开始遍历------\n");//这样包含头结点
while(NULL!=p->pNext)
{
printf("第%d节点数据为为%d\n",cnt,p->data);
p=p->pNext;
cnt++;
}
printf("第%d节点数据为为%d\n",cnt,p->data);
printf("------结束遍历------\n");
} */
printf("------开始遍历------\n");
while(NULL!=p->pNext)
{
cnt++;
p=p->pNext;
printf("第%d节点数据为为%d\n",cnt,p->data);
}
printf("------结束遍历------\n");
} void reverse_ergodic(struct node *pT)//反向遍历
{
int cnt=;
struct node *p=pT;
printf("------开始遍历------\n");
while(NULL!=p->pLast)
{
cnt++;
printf("第%d节点数据为为%d\n",cnt,p->data);
p=p->pLast;
}
printf("------结束遍历------\n");
}
void in_tail(struct node *pH,struct node *p_new)
{ //先找到尾节点
//插入
int cnt=;
struct node *p=pH;
while(NULL!=p->pNext)
{
p=p->pNext;
cnt++;
}
p->pNext=p_new; //插到之前最后的节点后面(后向指针)
p_new->pLast=p; //之前最后的节点后面防盗新节点的向前的指针(前向指针)
pH->data=cnt+;// 头节点数据代表链表个数
//前指针的pLast与新指针的pNext无变动
}
void in_head(struct node *pH,struct node *p_new)
{ //1。将原1好节点地址给新节点后向指针
//2。将头指针指向新节点
//3。原1号节点前向指针指向新节点
//4。新节点前向指针指向头结点
int cnt=;
struct node *p=pH;
while(NULL!=p->pNext)
{
p=p->pNext;
cnt++;
} if(NULL==pH->pNext)
{
pH->pNext=p_new;
p_new->pLast=pH; }else
{
p_new->pNext=pH->pNext;
pH->pNext=p_new;
p_new->pNext->pLast=p_new; //不判断的话p_new->pNext->pLast会引发段错误
p_new->pLast=pH;
}
pH->data=cnt+;// 头节点数据代表链表个数
//前指针的pLast与新指针的pNext无变动
}
void del_1(struct node *pH,int num)//根据节点数删除 不能删除0(头节点)
{ //1找到
//2删除
//删除(释放内存。指向下一个)
int cnt=;
struct node *p=pH;
struct node *p_sb;;//临时变量释放内存用
while(NULL!=p->pNext)
{
cnt++;
if(num==cnt)
{
p_sb=p->pNext;//p为预删除点的上一个节点
p->pNext=p->pNext->pNext;//跳过欲删除节点指向下下个节点(删除正向节点)
if(NULL==p->pNext)
{
//说明P为现在最后一个节点
}
else
{
p->pNext->pLast=p;//(删除反向节点)
}
free(p_sb);//释放内存
break;
}
p=p->pNext;//不满足上述条件时 寻找下一个节点 }
}
void del_2(struct node *pH,int data)//删除指定数据
{ //1找到
//2删除
//删除(释放内存。指向下一个)
struct node *p=pH;
struct node *p_sb;;//临时变量释放内存用
while(NULL!=p->pNext)
{
if(data==p->pNext->data)//p为预删除点的上一个节点
{ p_sb=p->pNext;
p->pNext=p->pNext->pNext;//跳过欲删除节点指向下下个节点(删除正向节点) if(NULL==p->pNext)
{
//说明P为现在最后一个节点
}
else
{
p->pNext->pLast=p;//(删除反向节点)
}
free(p_sb);
continue;
}
p=p->pNext; }
}
int main()
{
struct node *pHead=make_node();//初始化头节点;
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node()); reverse_ergodic(pHead->pNext->pNext->pNext->pNext);
ergodic(pHead); ergodic(pHead);
del_2(pHead,);
reverse_ergodic(pHead->pNext->pNext);
ergodic(pHead);
return ;
}

C语言双链表遍历,插入,删除的更多相关文章

  1. 20140502 static_cast和dynamic_cast的类型检查 双链表建立,删除,打印

    1.static_cast和dynamic_cast的类型检查 static_cast的类型检查:只检查无关类之间的转换 CBaseY* pY1 = static_cast<CBaseY*> ...

  2. 「C语言」单链表/双向链表的建立/遍历/插入/删除

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  3. 单链表的插入删除操作(c++实现)

    下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream ...

  4. [PHP] 数据结构-链表创建-插入-删除-查找的PHP实现

    链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1 ...

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

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

  6. 单链表创建、删除、查找、插入之C语言实现

    本文将详细的介绍C语言单链表的创建.删除.查找.插入以及输出功能 一.创建 #include<stdio.h> #include<stdlib.h> typedef int E ...

  7. 单链表的插入伪算法和用C语言创建单链表,并遍历

    非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p-> ...

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

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

  9. 单链表&双链表的头插入&尾插入

    #include<stdio.h> #include"stdlib.h" struct student { int data; struct student *pnex ...

随机推荐

  1. vim常用命令—撤销与反撤销

    命令模式下(即按ESC后的模式) u 撤销 Ctrl r (组合键) 反撤销<后悔撤销>

  2. 网络安全部门的漏洞扫描让你头痛不已么——PHP环境选它就可以了

    最近网络安全要求是越来越严,原来PHP编写的程序在XAMPP或者其他环境下总会被某款软件扫出漏洞,进而上级部门就停止了我们服务器的外网出口,然而自从发现了一款安全环境神器UPUPW后,这样的问题就再也 ...

  3. Centos6更新yum repo

    163开源镜像站是国内比较老的一个网站.很多人都在使用. step 1/3 备份原镜像文件: cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.r ...

  4. [zt]手把手教你写对拍程序(PASCAL)

    谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...

  5. Launch Image消失时添加动画

    CGSize viewSize = self.window.bounds.size; NSString *viewOrientation = @"Portrait"; //横屏请设 ...

  6. PokeCats开发者日志(十)

      现在是PokeCats游戏开发的第三十三天的中午,收到了中国版权保护中心软件登记部发来的受理通知书.   上易版权看一眼,貌似离拿证不远了.   想一想还有点小激动呢!

  7. HDU 2163 Palindromes

    http://acm.hdu.edu.cn/showproblem.php?pid=2163 Problem Description Write a program to determine whet ...

  8. vue-cli2使用cdn方式引入cytoscape

    1. index.html头部引用 <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.2.19/cytos ...

  9. centos7编译安装redis遇坑

    编译redis时:make cc Command not found 原因分析:没有安装gcc,执行: yum install gcc 编译redis时:error: jemalloc/jemallo ...

  10. poj 1018 Communication System (枚举)

    Communication System Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22380   Accepted:  ...