设计一代码,逆置带头结点的动态单链表L

有两种方法:

一是:用头插法建立单链表,自然而然就实现了逆置的动态链表。

代码:


#include
#include
typedef int datatype;
typedef struct node
{
	datatype data;
	struct node * next;
}linklist;

linklist *creatlistf()
{
	int n;
	linklist * head,*s;
	head=NULL;
	printf("请输入要插入的结点个数:");
	scanf("%d",&n);
	printf("请输入%d个结点:",n);
	while(n--)
	{
		s=(linklist *)malloc(sizeof(linklist));
		scanf("%d",&s->data);
		s->next=head;
		head=s;
	}
	return head;
}

void show(linklist *head)
{
	linklist *p;
	p=head;
	while(p!=NULL)
	{
		printf("%4d",p->data);
		p=p->next;
	}
}
int main()
{
	linklist *head;
	head=creatlistf();
	show(head);
	printf("\n");
	return 0;
}


二是:1、尾插法建立单链表  2、逆置单链表  

第2小步的过程是(以单链表  head->1->2->3->4->NULL为例):

  1. 断开head->1的指针
  2. 将2放到1前,此时   2->1->NULL
  3. 将3放到2前,此时   3->2->1->NULL
  4. 将4放到3前,此时   4->3->2->1->NULL
  5. 重新添加头结点head,实现逆置:head->4->3->2->1->NULL
代码:

#include
#include
typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *next;
}linklist;

linklist *creatlistr()
{
//	datatype elem;
	int n;
	linklist *head,*s,*r;
	head=(linklist *)malloc(sizeof(linklist));
	r=head;
	printf("请输入要插入的结点的个数:");
	scanf("%d",&n);
	printf("请输入%d个结点:",n);
	while(n--)
	{
		s=(linklist *)malloc(sizeof(linklist));
		scanf("%d",&s->data);
		r->next=s;
		r=s;
	}
	r->next=NULL;
	return head;
}

void reverseLinklist(linklist *head)
{
	linklist *y,*r,*t;
	t=NULL;
	r=NULL;
	y=head->next;
	head->next=NULL;	//断开头指针
	while(y!=NULL)		//从第一个结点起,将后边的结点依次放到最前边,实现逆置
	{
		t=y->next;
		y->next=r;
		r=y;
		y=t;
	}
	head->next=r;		//重新链接上头结点,保证最初链的完整
}

void show(linklist *head)
{
	linklist *p;
	p=head->next;
	while(p!=NULL)
	{
		printf("%4d",p->data);
		p=p->next;
	}
}
int main()
{
	linklist *head;
	head=creatlistr();
	reverseLinklist(head);
	show(head);
	printf("\n");
	return 0;
}


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