C语言【微项目14】—带头结点单链表逆置问题[在原链表上逆转/置](采用指针数组-顺序化思想实现)


目录
  • 一、ReverseSLinkList.c
  • 二、思路图示
  • 三、 运行结果示例

【TDTX】
【C99】
【编译与运行环境】64位Windows操作系统,TDM-gcc 4.9.2 64bit编译。
【问题描述】有一个带头结点的单链表,需要将它的指向关系逆转(逆置)
【思路】 1.本文解决思路比较独特!单链表由于“单”的特性,因此很难从后继位置获得其直接前驱的指针。
               2.同时,在学习数据结构时知道单链表插入方便、顺序化的数组查找方便。
               3.因而,把单链表顺序化使其兼具数组的特性,即可方便的获取链表任意结点的指针。
               4.顺序化方法很简单。建立一个长度为链表有效数据结点个数的指针数组,数组的每个元素保存结点的地址即可!
               5.而单链表的逆转(逆置)只需要通过该指针数组操作即可,可很方便容易的改变结点之间的指向关系!

一、ReverseSLinkList.c

#include 
#include 
typedef struct ListNode
{
	int data;
	struct ListNode* next;
}ListNode;

int init_LinkList(ListNode** H)
{
	//产生一个头结点,数据域不放数据 
	(*H) = (ListNode*)malloc(sizeof(ListNode));
	if((*H) == NULL)
	{
		return 0;
	}
	(*H)->data = -1;
	(*H)->next = NULL;
	return 1;
}
int TailInsert_LinkList(ListNode* h)
{
	ListNode* p = h;
	ListNode* q = NULL;
	int t;
	while(1)
	{
		int n = 0;
		puts("输入结点值:(f结束)");
		n = scanf("%d",&t);
		if(n != 1)
		{
			break;
		}
		q = (ListNode*)malloc(sizeof(ListNode));
		if(q == NULL)
		{
			return 0;
		}
		q->data = t;
		q->next = p->next;
		p->next = q;	
		p = q;
	}
	return 1;
}
void traverse_LinkList(ListNode* h)
{
	ListNode* p = h->next;
	while(p != NULL)
	{
		printf("%d ",p->data);	
		p = p->next;
	}
}
void reverse_LinkList(ListNode* h)
{
	int num = 0;
	
	ListNode* p = h->next;
	while(p != NULL)
	{
		//printf("%d ",p->data);
		num++;	
		p = p->next;
	}
	//printf("num=%d\n",num);
	ListNode* a[num];//C99
	
	p = h->next;
	int k = 0;
	
	while(p != NULL)
	{
		a[k++] = p;
		p = p->next;
	}
	/****************关键代码*****************/
	for(int i = num - 1;i >= 0;i--)
	{
		if(i == 0)
		{
			a[i]->next = NULL;//原首元结点的next指向NULL
		}
		else
		{
			a[i]->next = a[i-1];//逆转操作
		}
	}
	h->next = a[num-1];//头结点的next指向完成逆转后的首元结点
	/****************关键代码*****************/
	return;
}
int main()
{
	ListNode* L;
	init_LinkList(&L);
	TailInsert_LinkList(L);
	traverse_LinkList(L);
	puts("\n开始逆转单链表!");
	reverse_LinkList(L);
	traverse_LinkList(L);

	return 0;
}

二、思路图示

在这里插入图片描述
在这里插入图片描述

三、 运行结果示例

在这里插入图片描述


------------------------------------------------------第十四次发项目类文章有点激动啊!-----------------------------------------------------
-----------------------------------------------------【C语言—微项目—自编练习】----------------------------------------------------------
----------------------------------------------------------------【TDTX】--------------------------------------------------------------------------