c语言单链表倒置(附原理讲解)

c语言单链表倒置

今天博主,讲一个单链表倒置的例子,事实上

话不多说,我们直接上代码,待会会给大家讲解倒置算法实现原理

#include
#include
struct  link
{
	int data;
	struct link* next;
};                     // 定义指针型变量
void Print(link *l)              // 算法Print,依次访问每个元素结点
	{
		link *P;                     // 定义指针型变量
		P = l->next;//Blank 1
		while (P != NULL)
		{

			printf("%d ", P->data);//Blank 2
			P = P->next;

		}
		puts("");
	}
link * Reverse(link * L)             // 算法Reverse,实现链表元素结点的倒置
	{
		link * h, *u, *tmp;                        // 定义所要用到的指针变量
		h = NULL; u = L->next;
		while (u)//Blank 3
		{
			tmp = u->next;
			u->next = h;
			h = u;
			u = tmp;
			
			// Blank 4
		}
		L->next = h;
		return L;
	}
int linklength(link *l)                // 算法length
	{
		link* p;
		int i = 0;
		p = l;            // Blank 6
		while (p != NULL)
		{
			i++;
			p = p->next;      // Blank 7
		}
		return i - 1;//Blak 8
	}
link * create_hsllist(link* l) {
	int n;
	int i;
	link* p;
	
	p =(link *)malloc(sizeof(link));
	 l=p;
	 //printf("%d %d", l, p);
	p->next= (link*)malloc(sizeof(link));
	p = p->next;
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		
		scanf_s("%d", &p->data);
		
		if (i != n - 1) {
			p->next = (link*)malloc(sizeof(link));
			p = p->next;
		}
		else p->next= NULL;

	}
	return l;

	
	}


int main()
{
	printf("start");
	link * l=NULL;

	l=create_hsllist(l);                     // 调用函数库中的函数构建链表l
	   // disp_check_hsllist("Created Sllist",l);     // 显示并检查链表l
	printf("Length=%d\n", linklength(l));      // 调用算法求链表l的长度
	Print(l);                          // 调用算法Print 对l运算
	l=Reverse(l);                    // 调用算法Reverse倒置l表的头结点之后的部分
	printf("Length=%d\n", linklength(l));
	Print(l);
	// disp_check _hsllist("Reversed Sllist",l);   // 显示在调用算法Reverse倒置后的结果链表l


	return 0;

}

倒置的实现,原理,博主一开始也没想到,方法比较好,下面绘制图形讲解原理:
首先,我们会有一个单链表指针指向头结点,一般头结点没有数据
c语言单链表倒置(附原理讲解)_第1张图片
然后,这时候,我们定义一个指针h指向null,一个指针u指向L->next,一个tmp指向u->next。
c语言单链表倒置(附原理讲解)_第2张图片
这时候,我们再另u指向h,并再将h指向u,再将u指向tmp,我们就会得到如下结果:
c语言单链表倒置(附原理讲解)_第3张图片
你会发现链表被我们拆开了,之后,我们依次拆开主链表,并将拆开的节点指向h,我们就可以,通过这个方法倒置单链表。

你可能感兴趣的:(c++与c语言,指针,链表,数据结构,单链表,算法)