C语言实现单链表的遍历,逆序,插入,删除
2024-08-28 17:05:54
单链表的遍历,逆序,插入,删除
#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 ;
}
最新文章
- DirectShow+VS2010+Win7配置说明
- 【转】Android各种Adapter的用法
- Java中值传递的实质,形式参数与实际参数。引用传递。
- (一)Eclipse 快捷键
- OPNET安装要点
- 奇妙的go语言(聊天室的开发)
- haproxy path_end不能忽略
- KnockOut文档--模板绑定
- MySQL5.7使用过程中遇到的问题
- 判断一个jquery对象是否为空
- 剑指Offer——咪咕笔试题+知识点总结
- count
- [JDK8]读写锁的改进:StampedLock
- 查询树节点、oracle、select...start with...connect by prior...
- kali linux DVWA config 问题解决方案
- 一、fopen与fclose
- python基础学习第一天
- JQuery攻略(四)事件
- mybatis 之 resultType=";Integer";
- AndroidStudio 导包遇到so文件的解决方案----------JPush推送