单链表的遍历,逆序,插入,删除

#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 ;
}

最新文章

  1. DirectShow+VS2010+Win7配置说明
  2. 【转】Android各种Adapter的用法
  3. Java中值传递的实质,形式参数与实际参数。引用传递。
  4. (一)Eclipse 快捷键
  5. OPNET安装要点
  6. 奇妙的go语言(聊天室的开发)
  7. haproxy path_end不能忽略
  8. KnockOut文档--模板绑定
  9. MySQL5.7使用过程中遇到的问题
  10. 判断一个jquery对象是否为空
  11. 剑指Offer——咪咕笔试题+知识点总结
  12. count
  13. [JDK8]读写锁的改进:StampedLock
  14. 查询树节点、oracle、select...start with...connect by prior...
  15. kali linux DVWA config 问题解决方案
  16. 一、fopen与fclose
  17. python基础学习第一天
  18. JQuery攻略(四)事件
  19. mybatis 之 resultType=&quot;Integer&quot;
  20. AndroidStudio 导包遇到so文件的解决方案----------JPush推送

热门文章

  1. oraclize预言机资料
  2. C#通过gridview导出excel
  3. Swift-assert使用时机
  4. C#,Winform 文件的导入导出 File
  5. python获取本地时间
  6. 生活中的goto
  7. 【bzoj1692】[Usaco2007 Dec]队列变换 贪心+后缀数组
  8. BZOJ5466 NOIP2018保卫王国(倍增+树形dp)
  9. Oracle-RAC原理
  10. CentOS 文件搜索find