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

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

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

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

2.链表元素的插入

  1. 头插法
  2. 尾插法
  3. 指定位置插入法

**头插法

先上代码

//头插法    
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;
	}
}

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

感谢观看。

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐