C语言动态链表数据结构
链表的操作增删改查
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语言动态链表数据结构的更多相关文章
- C语言动态链表数据结构实现的学生信息项目
注:此项目来源于吕鑫老师的教程 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> u ...
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- C++ 数据结构模板 队列 栈 动态链表 模板 Queue Stack List
C++数据结构模板,可以实现基本功能,用法和stl差不多,比如Q.pop();Q.push(a);Q.front();...... (由于动态链表用的不多,若有错误望各位大神不吝赐教:) 队列: cl ...
- [数据结构】【c语言】链表的创建和遍历
第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...
- 1. C语言中的数据结构.md
C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...
- HDU 2095 find your present (2) 动态链表
解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数. 看起来好像很简单的样子,不过,这题的重点不在这 ...
- 关于c语言单项链表尾添加
犹豫了几天,看了很多大牛写的关于c语言链表,感触很多,终于下定决心,把自己对于链表的理解随之附上,可用与否,自行裁夺.由于作者水平有限也是第一次写,不足之处,竭诚希望得到各位大神的批评指正.制作不易, ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
随机推荐
- webpack使用六
插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务. Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以 ...
- InstallShield2015创建安装包
1.新建 InstallScript MSI Project工程 a)输入项目名称Project Name: XBS(例如) b)输入创建目录Location: C:\(例如) c)如果勾选“ ...
- [openjudge-搜索]深度优先搜索之马走日
题目描述 描述 马在中国象棋以日字形规则移动.请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行 ...
- <keep-alvie></keep-alive>
<keep-alive></keep-alive>的作用是什么? <keep-alive></keep-alive> 包裹动态组件时,会缓存不活动的组件 ...
- KKT条件原理
问题引入 max f(x, y) s.t. g(x,y) <= 0 几何解释 a. g(x ,y) <= 0为上图中z = 0平面中的圆,圆的边表示g(x, y) = 0,圆的内部表示g ...
- Class__Two
今天老师要求做查找英文文章中最高频的词 文章用文本储存 import java.io.BufferedReader;import java.io.File;import java.io.FileIn ...
- springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢?
springboot maven项目,为什么build成功,build path也没错误,project-->clean 也没用,项目上面还是有个红x呢? 看错误信息有提示: Descript ...
- 苹果手机显示分享链接的方法html页面
function onBridgeReady(){ WeixinJSBridge.call('showOptionMenu'); } if (typeof WeixinJSBridge == &quo ...
- postgresql查询语句
//查询表名称SELECT tablename FROM pg_tablesWHERE tablename NOT LIKE 'pg%'AND tablename NOT LIKE 'sql_%' O ...
- 调查显示数据分析已取代Web开发成为第一用例
一项关于Python的开发者调查显示,编程语言现在主要用于数据分析,取代了之前的第一个用例Web开发. 去年秋天,由Python软件基金会和开发人员工具供应商JetBrains进行,2018 Pyth ...