链表的操作增删改查

typedef int DATA;

struct SNode
{
DATA data;
SNode* pNext;
}; SNode* g_head=NULL;//全局变量 //从头部添加
void AddHead(DATA nNum)
{
SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
//SNode* p = new SNode;//C++ 方式
p->data = nNum;
p->pNext = g_pHead; g_pHead = p;
} //从尾部添加
void AddTail(DATA nNum)
{
SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
pNew->data = nNum;
pNew->pNext = NULL; if (!g_pHead)
{
g_pHead = pNew;
return;
} SNode* p = g_pHead;
SNode* p1 = NULL;
while (p)
{
p1 = p;
p= p->pNext;
} //跳出循环时,p1记录的时最后一个节点,让最后一个节点的pNext指向新创建的节点
p = p1;
p->pNext = pNew; //另一种写法
//while(p->pNext != NULL)//循环遍历,当下一个节点为空说明到尾部了
// p=p->pNext;
//p->pNext = pNew;
} //找到,返回找节点位置;失败返回-1
int FindNodeIndex(DATA nNum)
{
SNode* p = g_pHead;
int i =;
while(p)
{
if (p->data == nNum)
{
return i;
} p = p->pNext;
++i;
} return -;
} //删除成功返回-1;失败返回0
int DeleteNode(DATA nNum)
{
SNode* p = g_pHead;
SNode* p1 = NULL;//记录前一个节点 if (p == NULL)//当前链表为空
{
return -;
} //头节点没有前一个节点,要特殊处理
if (p->data == nNum)
{
g_pHead = p->pNext;
delete p;
return ;
}
while(p)
{
if (p->data == nNum)
{
//删除当前节点时,让当前节点的前一个节点的pNext指向当前节点的后一个节点
p1->pNext = p->pNext;
delete p;
return ;
}
p1= p;//记录前节点
p = p->pNext;
} return -;
} //修改指定节点的值
void ModifyNode(DATA oldNum,DATA newNum)
{
SNode* p = g_pHead;
while(p)//
{
if (p->data == oldNum)
{
p->data = newNum;
}
p = p->pNext;
}
} //打印所有节点
void PrintALL()
{
SNode* p = g_pHead;
if (p == NULL)
{
printf("当前链表为空\n");
return;
}
while(p)//
{
printf("%d\n",p->data);
p = p->pNext;
}
} //成功返回0;失败返回-1
int FindNode(DATA nNum)
{
SNode* p = g_pHead;
while (p)
{
if (p->data == nNum)
{
return ;
} p=p->pNext;
}
return -;
} //在某个节点之后插入新节点;成功返回0;失败返回-1
int InsertNode(DATA npos,DATA nNum)
{
SNode* pNew = new SNode;//C++ 方式
pNew->data = nNum;
pNew->pNext = NULL; SNode* p = g_pHead; //if (p->data == npos)//头结点
//{
// pNew->pNext=p->pNext;//头节点指向的下一个节点指针放到新节点的pNext
// p->pNext=pNew;//头节点pNext指向新节点 // return 0;
//} while(p)
{
if (p->data == npos)
{
pNew->pNext = p->pNext;
p->pNext=pNew; return ;
}
p = p->pNext;
} return -;
} void DeleteAll()
{
SNode* p = g_pHead;
SNode* p1 = NULL;
while(p)
{
p1=p;
p= p->pNext; delete p1;
} g_pHead = NULL;
} int main()
{
DeleteNode();//链表为空的时候,删除要加判断 lAddHead();
lAddHead();
AddHead();
puts("修改前");
PrintALL();
ModifyNode(,-);
puts("修改后");
lPrintALL(); int i = FindNodeIndex(-);
if (i >= )
{
cout << "第" << i+ << "个节点找到" <<endl;
} //删除节点
i = DeleteNode();//头部删除要特殊处理
if (i == )
{
cout << "删除节点成功!" << endl;
}
else
{
cout << "删除节点失败!" << endl;
}
PrintALL(); puts("尾部添加");
AddTail();
PrintALL(); //修改节点
ModifyNode(-,);
puts("插入节点3");
//插入节点
i = list.InsertNode(,); list.PrintALL(); puts("清空链表");
DeleteAll();
PrintALL();
return ;
}

1.头部插入

2.尾部插入

3.在指定节点位置后面插入新节点

例如:在节点2后面插入新节点4

中间插入新节点4,让节点2的pNext赋值给新节点4的pNext,然后让新节点4的地址赋值给节点2的pNext

4.删除节点

注意:如果删除的是头节点,要特殊处理,因为头节点没有前面的节点,所以头节点的pNext赋值给g_head;

C语言动态链表数据结构的更多相关文章

  1. C语言动态链表数据结构实现的学生信息项目

    注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...

  2. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  3. C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List

    C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...

  4. [数据结构】【c语言】链表的创建和遍历

    第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...

  5. 1. C语言中的数据结构.md

    C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...

  6. HDU 2095 find your present (2) 动态链表

    解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...

  7. 关于c语言单项链表尾添加

    犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...

  8. C语言之链表

    这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...

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

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

随机推荐

  1. webpack使用六

    插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务. Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以 ...

  2. InstallShield2015创建安装包

    1.新建  InstallScript MSI Project工程 a)输入项目名称Project Name:  XBS(例如) b)输入创建目录Location:   C:\(例如) c)如果勾选“ ...

  3. [openjudge-搜索]深度优先搜索之马走日

    题目描述 描述 马在中国象棋以日字形规则移动.请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行 ...

  4. <keep-alvie></keep-alive>

    <keep-alive></keep-alive>的作用是什么? <keep-alive></keep-alive> 包裹动态组件时,会缓存不活动的组件 ...

  5. KKT条件原理

    问题引入 max f(x, y) s.t. g(x,y) <= 0 几何解释 a.  g(x ,y) <= 0为上图中z = 0平面中的圆,圆的边表示g(x, y) = 0,圆的内部表示g ...

  6. Class__Two

    今天老师要求做查找英文文章中最高频的词  文章用文本储存 import java.io.BufferedReader;import java.io.File;import java.io.FileIn ...

  7. springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢?

    springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢? 看错误信息有提示:  Descript ...

  8. 苹果手机显示分享链接的方法html页面

    function onBridgeReady(){ WeixinJSBridge.call('showOptionMenu'); } if (typeof WeixinJSBridge == &quo ...

  9. postgresql查询语句

    //查询表名称SELECT tablename FROM pg_tablesWHERE tablename NOT LIKE 'pg%'AND tablename NOT LIKE 'sql_%' O ...

  10. 调查显示数据分析已取代Web开发成为第一用例

    一项关于Python的开发者调查显示,编程语言现在主要用于数据分析,取代了之前的第一个用例Web开发. 去年秋天,由Python软件基金会和开发人员工具供应商JetBrains进行,2018 Pyth ...