链表的操作增删改查

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. ecshop 前台分页

    在当前需要分页的if最后div里面加入这句, <!-- #BeginLibraryItem "/library/pages.lbi" --><!-- #EndLi ...

  2. ECshop后台新功能权限添加

    ecshop后台新功能权限的添加 1.在后台“推荐管理”里添加“推荐人分成”.“会员分成”两个操作功能以及权限 index.php?act=menu incluedes/inc_priv.php:权限 ...

  3. mongodb mapredReduce 多个条件分组(group by)

    from:https://my.oschina.net/chiyong/blog/289138 Mongodb 没有传统数据库的group函数,如果分组需要走MapReduce.这种MR与Hadoop ...

  4. js单双引号

    JavaScript单双引号的使用没有严格的要求,单独出现的时候,用单用双都可以的,但是如果一起出现的话就要严格区分了

  5. SEO经验-如何做到新站上线半个月谷歌收录3万

    一个网站在做搜索引擎优化的时候,首先考虑的肯定是百度,这个是毋庸置疑的,毕竟百度占领者差不多七成的搜索市场份额. 第二考虑的是360搜索,这个也是毋庸置疑的,因为360搜索占领者差不多两成的搜索市场份 ...

  6. C# 调用.bat 提示该命令不是内部命令或外部命令

    前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...

  7. Widget Factory (高斯消元解线性方程组)

    The widget factory produces several different kinds of widgets. Each widget is carefully built by a ...

  8. Runtime(IV) - 序列化与反序列化

    准备条件 父类 Biology Biology.h #import <Foundation/Foundation.h> @interface Biology : NSObject { NS ...

  9. Spark学习之路 (六)Spark Transformation和Action

    Transformation算子 基本的初始化 java static SparkConf conf = null; static JavaSparkContext sc = null; static ...

  10. django中orm的批量操作

    ORM批量操作 数据模型定义 from django.db import models class Product(models.Model): name = models.CharField(max ...