C语言实现单链表的遍历,逆序,插入,删除
单链表的遍历,逆序,插入,删除
#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 *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->pNext=NULL;//将来要指向下一个节点的首地址
//实际操作时将下一个节点的malloc 返回的指针给他。
return p;
}
void in_tail( struct node *pH,struct node *new_node)//节点尾部插入
{
//(1)先找到最后一个节点
//(2)插入
int cnt=;
struct node *p=pH;
while(NULL!=p->pNext)
{
p=p->pNext;
cnt++;
}
p->pNext=new_node;
pH->data=cnt+;// 头节点数据代表链表个数
}
void in_head(struct node *pH,struct node *new_node)
{
//头节点next指向新节点地址
//新结点next指向之前第一个节点地址
//头节点data++
new_node->pNext=pH->pNext;
pH->pNext=new_node;
pH->data++;
}
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 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;//跳过欲删除节点指向下下个节点。
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;
free(p_sb);
continue;
}
p=p->pNext; }
}
void Nixu(struct node *pH)//逆序
{
struct node *p=pH->pNext;
struct node *p_sb;//临时变量释放内存用
if((NULL==pH->pNext)||(NULL==p)) return;//无节点直接退出
while(NULL!=p->pNext)
{
p_sb=p->pNext;
if(p==pH->pNext)//第一个节点,放最后面
{
p->pNext=NULL;
}
else
{
p->pNext=pH->pNext;//当前节点插入第一个节点前。
//或者说将当前节点作为第一个节点。
}
pH->pNext=p; //更新第一节点地址。 p=p_sb; //指向下一个节点
//p=p->pNext; //指向下一个节点
}
in_head(pH,p);
} int main()
{
int n;
//定义头指针
// struct node *pHead= NULL;
struct node *pHead=make_node();//初始化头节点; // in_tail(pHead,make_node(2223));
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node());
in_head(pHead,make_node());
ergodic(pHead);
Nixu(pHead);
/* printf("输入要删除的节点数:");
scanf("%d",&n);
del_1(pHead,n); */
//del_2(pHead,3);
ergodic(pHead);
return ;
}
C语言实现单链表的遍历,逆序,插入,删除的更多相关文章
- C语言实现单链表,并完成链表常用API函数
C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...
- C语言实现单链表-03版
在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...
- C/C++语言实现单链表(带头结点)
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...
- C语言实现单链表-02版
我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...
- C语言实现单链表节点的删除(带头结点)
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...
- 数据结构C语言版--单链表的基本功能实现
/* * 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表 * 并统计该线性链表的长度 . *注:new和delete是C++的运算符 malloc和free是C++/C的 ...
- C语言一个单链表的实现
-- 所谓链表记住一句即可:地址不连续,大家只是握个手而已: list0.c #include<stdio.h> #include<malloc.h> typedef int ...
- 算法--链表的K逆序问题
转载请标明出处http://www.cnblogs.com/haozhengfei/p/9e6f4dda3138cf9fab17f996ec85b624.html 链表的K逆序问题 链表的k逆 ...
- SDUT OJ 数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
随机推荐
- Django创建App报错
在django下创建APP项目时遇到的坑 python manage.py startapp app01 报错内容如下: 解决:找到报错中的文件夹151行删除items(),)中的逗号即可 在命令行下 ...
- error:no module named StringIO or cStringIO
一般遇到没有某个模块问题的时候,通常的解决方法是pip相应的模块: 不过,鉴于Python2和python3的不同(让人头疼) 解决方法:在python3中,该模块被新的模块取代,即io. 重新imp ...
- 【转】Charles 从入门到精通
目录与版权 转载请保留顶部的 Charles 中国特惠内容,本文的内容主要包括: Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤 ...
- PHP中通过preg_match_all函数获取页面信息并过滤变更为数组存储模式
// 1. 初始化 $ch = curl_init(); // 2. 设置选项 curl_setopt($ch, CURLOPT_URL, "http://test.com/index.js ...
- Java学习个人备忘录之构造函数&this
构造函数 概念:构建创造对象时调用的函数. 作用:可以给对象进行初始化,创建对象都必须要通过构造函数初始化. 一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数.如果在类中定义了指 ...
- 学霸系统UI项目功能说明书 v1.0版本
发布人员:软件工程实践小队. 发布内容:学霸系统UI项目说明书. 版本:学霸v1.0版本. 学霸系统UI项目说明书 v1.0版本分为以下部分: Part 1:用户须知: Part 2:功能实现: Pa ...
- Khan Academy
Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.
- 关于GenericJDBCException的问题
在spring和hibernate整合的初步阶段,还没有编辑hibernate.cfg.xml这个文件,只有一个beans.xml文件.此时遇到了一个bug. Exception in thread ...
- python学习笔记07:自定义类型
class person: def __init__(self,name,age,weight): self.name = name self.age = age self.weight = weig ...
- PAT 甲级 1032 Sharing
https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920 To store English words ...