C语言单链表的逆转

       单链表的逆转是一个基础的数据结构题,做起来不难。和解决这个问题一起写的还有做题的规矩,不能因一个问题简单就直接开始写代码,对于初学者来说,写代码前先写一个程序的大致框架是很有用的。

解题思路:
       创建一个单链表,遍历这个链表并且以头插法将这个链表赋值给另一个链表。
       另外,我也得写下我这个菜鸟遇到的问题和解决办法,不管遇到的问题有多基础,有问题就得解决并且记录,这是一个菜鸟的尊严。
问题:
       首先,我所理解的链表就是,有头指针,链表的最后一个元素的后继是空(NULL),这才能称之为链表。
       我遇到的算法上的问题就是,如何将一个链表上的值赋给另一个链表(傻瓜问题,但是有问题就得记录),刚开始我是直接将链表赋值的(傻瓜操作,得改),知道错了就改变方法。
       链表上的每一个元素都有数据域和指针域,每次赋值的时候得开辟一个链表元素类型(即结构体指针类型)的内存空间,然后将数据赋值给开辟好的内存空间的数据域,再将这个内存空间(即一个在磁盘上拥有自己的空间的结构体指针)以头插法连到新的链表上,新的链表刚开始当然是一个空链表,但是作为一个链表,必须要有一个链表该有的东西,即头指针,而且其后继要为NULL,这是原则问题。

代码如下:

#include
#include
#include

//定义结构体
typedef struct Node
{
	int data;
	struct Node *next;
}Node;
typedef struct Node *LinkList;

//头插法创建链表
void CreateListHead(LinkList *L,int n)
{
	LinkList p;
	int i;
	srand(time(0));
	*L = (LinkList)malloc(sizeof(Node));
	(*L)->next = NULL;
	for(i=0; i<n; i++)
	{
		p = (LinkList)malloc(sizeof(Node));
		p->data = rand()%100+1;
		p->next = (*L)->next;
		(*L)->next=p;
	}
}

//单链表的逆转
LinkList reverse(LinkList L)
{
	LinkList S=NULL;                       //定义头指针
	S = (LinkList)malloc(sizeof(Node));    //这步必须有,这是尊严
	S->next=NULL;                          //一个空链表的尊严
	while(L->next)
	{
		LinkList p = (LinkList)malloc(sizeof(Node));
		p->data = L->next->data;
		p->next = S->next;
		S->next = p;
		L = L->next;
	}
	return S;
}

void main()
{
	LinkList L=NULL;          //定义头指针
	LinkList S=NULL;          //定义头指针
	CreateListHead(&L,5);     //创建链表
	//打印创建好的链表
	LinkList p=L->next;
	while(p)
	{
		printf("%d\t",p->data);
		p=p->next;
	}
	printf("\n");
	//逆转单链表并且打印
	S = reverse(L);
	LinkList q=S->next;
	while(q)
	{
		printf("%d\t",q->data);
		q=q->next;
	}
}



你可能感兴趣的:(数据结构)