栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构---单链表的增删改查(C语言实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构---单链表的增删改查(C语言实现)

链表的创建链表元素插入(头插,尾插,指定位置插入)链表元素的删除链表元素的查看

1.链表的创建(有头链表)

            有头链表的创建就是创建一个头结点代表此链表,用一个结构体指针指向头结点,通常称为头指针,方便找到此链表。

      头结点的数据域一般不做处理(不存放数据)

代码如下

Node* createList()
{

	Node* headNode = calloc(1, sizeof(Node));	//动态内存分配,为头结点分配内存
	if (!headNode)  return;		//判断内存是否申请成功
	else {
		headNode->next = NULL;    //对头结点的指针域做处理,数据域不做处理
	}
	Node* pList = headNode;		//创建头指针指向头结点
	return headNode;            //返回一个头结点,方便创建链表的时候直接调用该函数
}

2.链表元素的插入

    头插法尾插法指定位置插入法

**头插法

先上代码

//头插法    
void InsertByHead(Node* headNode,DATA* pval)    //pval是你要插入的数据,头插头插肯定是要插入数据的
{
    //只有头结点的情况下
	if (headNode->next == NULL)	            //说明此链表只有头结点
	{
		Node* newNode = calloc(1, sizeof(Node));    //动态分配一个新节点
		if (newNode != NULL)                 //如果内存申请成功的话执行以下操作
		{
			newNode->data = pval;            //把需要插入的元素pval放在newNode里面
			headNode->next = newNode;        //让头结点指向 newNode,此时链表有两个节点一个是头结点(数据域没有存放数据),另一个是newNode.
		}
		
	}
    //不是只有头结点
	else if (headNode->next != NULL)
	{
		Node* newNode = calloc(1, sizeof(Node));    //动态分配一个新节点
		if (newNode)
		{
            newNode->data = pval;                    //把需要插入的元素pval放在newNode里面
			newNode->next = headNode->next;          //新节点指向头结点的后面
			headNode->next = newNode;                //头结点指向新节点连接起来
		}
		

	}
}

头插法的图解

**尾插法

尾插法就比较简单了,只要找到尾节点(指针域为NULL),直接让尾节点的指针指向新节点就行

代码如下

//尾插法
void InsertByTail(Node* headNode, DATA* pval)
{
	Node* pMove = headNode->next;	//创建一个移动的指针
	while (pMove)				//判断指针的指向不为Null时,pMove一直往下走
	{
		pMove = pMove->next;
	}
	//退出while循环时此时pmoVe就是尾节点
	Node* newNode = calloc(1, sizeof(Node));	//创建新节点
	newNode->data = pval;						//数据赋值
	pMove->next = newNode;						//原来的尾节点指向newNode ,结束后newNode即为此链表的尾节点

}

尾插法图解

 

 **指定位置插入

 指定位置插入是头插和尾插的结合版    代码很好理解。

//指定位置插入
 
void InsertByPos(Node* headNode, DATA* pval, DATA val)	//pval是要插入的元素,val是指定位置的数据
{
	Node* pMove = headNode->next;	//创建一个移动的指针
	while (pMove->next->data != val )	//判断pMove的next的数据域不等于val时,pMove一直往下走
	{
		pMove = pMove->next;
	}
	//把链表遍历了一遍也没有找到指定的位置
	if (pMove->next == NULL)
	{
		puts("你要指定的位置没有找到");
	}
	//此时pMove就是指定节点的前一个节点
	Node* newNode = headNode->next;	//创建一个新节点

	//以下三行代码和头插法类似
	newNode->data = pval;
	newNode->next = pMove->next;
	pMove->next = newNode;
}

**链表元素的删除

删除的话很好理解  主要是找到要删除的元素的节点在哪就可以了,和指定位置删除的过程相似

代码如下

/删除
void Dele(Node* headNode, DATA val)
{
	Node* pMove = headNode->next;	//创建一个移动的指针
	while (pMove->next->data != val)					//判断指针的下一个节点的数据不等于val,pMove一直往下走
	{
		pMove = pMove->next;
	}

	//把链表遍历了一遍也没有找到指定的位置
	if (pMove->next == NULL)
	{
		puts("你要删除的位置没有找到");
	}

	//此时 pMove为要删除的节点的前一个节点
	Node* newNode = pMove->next;		//找一个newNode指向pMove(需要删除的节点)
	pMove = newNode->next;				//pMove指向删除节点的下一个节点   确保链表不断开
	free(newNode);				//释放掉需要删除的节点

}

删除节点的图解

 

**链表元素的查看  

就是遍历一遍链表,输出每个节点的内存即可

代码如下

//打印链表
void PrintList(Node* headNode)
{
	Node* pMove = headNode->next;
	while (pMove != NULL)
	{
		printf("%d ", pMove->data);
		pMove = pMove->next;
	}
}

链表元素的修改,看了以上链表操作,元素的修改不是什么大事了。

感谢观看。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号