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 ...
随机推荐
- Document对象内容集合
document 文挡对象 - JavaScript脚本语言描述———————————————————————注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写否则会提示你一 ...
- 自测之Lesson6:文件I/O
题目:区分文件I/O和标准I/O. 区别: ①首先两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区), ...
- “Hello world!”贡献分分配规则
规则1:得到总分后取14分,剩下分数进行平分.(备注:例如得了50分,取出14分,剩下36分组内进行平分) 规则2:对于会议准时参加者每人加0.5分.(备注:按通知开会时间为准,准时到者实行加分.) ...
- Thunder团队第一周 - Scrum会议4
Scrum会议4 小组名称:Thunder 项目名称:爱阅app Scrum Master:代秋彤 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- Java中的增强for循环
增强 for 循环 1. 增强的 for 循环对于遍历 Array 或 Collection 的时候相当方便. import java.util.*; public class Test { publ ...
- Alpha 冲刺3
队名:日不落战队 安琪(队长) 今天完成的任务 组织第三次站立式会议. 完成了个人信息前端界面. 明天的计划 草稿箱前端界面. 个人信息扩展界面框架. 还剩下的任务 回收站前端界面. 信息修改前端界面 ...
- VS2005、VS2008中的快捷键、组合键大全
Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...
- Jmeter系列-webdriver代码范例
范例 WDS.sampleResult.sampleStart() try{ //打开博客首页 WDS.browser.get('http://xqtesting.blog.51cto.com') / ...
- C# 开发者最经常犯的 8 个错误
在和C#新手一起工作的时候,我注意到他们经常重复一些错误.这些错误,当你指出来的时候很容易理解.然而,如果一个开发者没有意识到这些错误,将会影响正在开发的软件的质量和效率,因此,我决定总结8个常见的错 ...
- AutoHotKey 快速入门
AutoHotKey 是一个免费的键盘宏程序,可以用于配置键盘快捷键.鼠标事件 以及摇杆事件,还可以在输入文本的时候对文本进行扩展(自动补全) 第一个脚本 新建文件test.ahk并输入以下内容: ^ ...