【数据结构】尾插法链表初始化、新增和删除指定位置的数据

一.使用尾插法进行链表初始化

        使用尾插法进行链表初始化的一个好处是新数据可以从链表的尾部接入,使得链表遍历时按照先进先出的原则进行输出。在本次例子中,我们采用结构体进行数据存储:

	typedef struct Node //链表结构体
	{
		int Param;
		struct Node *next;
	}Node;

        使用尾插法,我们需要初始化三个兄弟,分别是L、r和p(当然也不一定要这个名字,你们可以随便起三个),第一个是L头结点,该节点不存储数据,仅作为带头作用,如图下所示:

         其中指针“L”的作用是永久性地指向头结点,便于后面遍历、添加等操作时迷路了可以回来。如此同时,我们还需要有一个指针“r”用来指向当前所在的结点

        如何理解“指向当前所在的结点”?比如在遍历整个链表时,如果遍历到了第四个结点,那么指针“r”就会指向第四个,就是这个意思。最后是指针“p”,该指针只要负责新建结点

 

        三个指针的作用都介绍完毕,接下来即是初始化步骤,要做的工作是初始化一个空结点作为头结点,并且让r指向第一个结点:

	Node* L; 
	Node* p; 
	Node* r;

	L = (Node*)malloc(sizeof(Node));
	L->next = NULL;
	if (L == NULL)
		//报错信息
	r = L;

 二.新增/尾部插入结点

        新增结点的第一步,凭空生成一个结点p:

        第二步,往结点里面插入自己需要的参数,并且把Next指针赋值为NULL(因为没有下一个结点):

        第三步,将上一个节点(本次例子为L指向的空结点)和新初始化的结点连接在一起:

        最后,将指针“r”指向当前节点(也就是p):

        这样,新增结点的步骤就完成了,往后再次新增结点也只是不断重复以上步骤就行,代码如下:

void NodeCreat(int Param)
{
    p = (Node*)malloc(sizeof(Node));
	p->Param = Param;
	p->next = NULL;
	r->next = p; //不可以写成L->next = p,如果不知道为什么,就尝试着插入2个以上的数据看看会发生什么
	r = p;
}

三.删除指定位置的结点

        删除指定位置的结点会出现很多中情况,我们需要根据不同的情况采取不同的预错措施,我们先来说明删除结点的方法,初始化一个指针q,作用为找到目标(location)的上一个结点:

        随后进行删除:

         在删除结点时,会有以下几种情况出现:

  • 删除的是第一个结点
  • 删除的是第一个结点 && 第一个结点刚好是最后一个结点
  • 删除的是中间的结点
  • 删除的是中间的结点 && 想要删除的是最后一个结点

        针对以上情况,则有以下的代码:

void DeleteNode(int location)
{
	Node* q = L->next;
	Node* Delq;
	int Tmp_location = 0;

	while (L->next != NULL) //不止有一个节点
	{
		if (Tmp_location == location) //删除第一个节点
		{
			if (L->next->next == NULL) //第一个节点是最后一个节点
			{
				free(L->next);
				L->next = NULL;
				r = L;
				break;
			}

			Delq = q;
			L->next = q->next;
			free(Delq);
			break;
		}
		else if (Tmp_location == location - 1) //删除中间的节点
		{
			if (q->next->next == NULL) //删除最后一个节点
			{
				free(q->next);
				q->next = NULL;
				r = q;
				break;
			}

			Delq = q->next;
			q->next = q->next->next;
			r = q->next;
			free(Delq);
			break;
		}
		else
		{
			q = q->next;
			Tmp_location++;
		}
	}
}

         以上的删除结点代码针对不同情况作出了不同的响应,防止在删除结点时出现奔溃状况,同时在删除后将指针r保持在当前位置,方便后续操作

猜你喜欢

转载自blog.csdn.net/qq_41884002/article/details/129790341