数据结构:单链表逆置

实验要求:

写出将单链表逆置的算法。即令单链表的第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,…,最后一个结点变为第一个结点。

依次从键盘读入数据,逆序建立链表L;

逆置链表L(创建新的链表New保存逆置的结点);


代码解析:

主函数int main():

定义链表的长度n;

调用CreateList函数创建长度为n的链表;

调用InvertList函数将链表内元素转置并输出;

定义链表的结构体类型为LNode,规定结点的数据域和结点的指针域

定义函数struct LNode *CreatList(int n)逆位序创建链表并输出所创建的链表的元素值。

定义需要创建的链表元素个数n;

建立一个带头结点的单链表;

逆序位输入指定元素个数的链表元素数值;

输入逆序位建立链表的链表元素;

定义函数void InverList(struct LNode *L)转置链表内元素并输出。

建立一个带头结点的新链表r;

q指向链表的第一个元素;

开辟新结点s,将q的值赋给s;

令s->next为NULL并使其成为r的后续结点;

利用while循环,将q不断后移,指向链表的后续元素。开辟新结点p将q的值         赋给p,将p插入结点s和结点i中间;

令s的指针指向p;

输出转置后的链表;


实验代码:

#include <stdio.h>
#include <stdlib.h>

//定义链表类型
struct LNode{
	int data;                                             //结点的数据域
	struct LNode *next;                                   //结点的指针域
};


//创建逆序链表
struct LNode *CreatList(int n)
{
	struct LNode *L,*p;
	printf("请输入逆序创建链表的元素的个数:\n");           //确定链表元素的个数
	scanf("%d",&n);
	L = (struct LNode*)malloc(sizeof(struct LNode));       
	L->next  = NULL;                                       //建立一个带头结点的单链表
	printf("请输入逆序链表元素:\n");
	while(n--){                                            //逆序位输入n个元素的数值
		p=(struct LNode*)malloc(sizeof(struct LNode));     
		scanf("%d",&p->data );                             //输入指定元素个数的链表元素数值
		p->next = L->next ;
		L->next =p;
	}
	printf("输出链表中的元素:\n");                         //直接输出所创建的逆序链表
	while(p!=NULL)
	{
		if(p->next ==NULL)
			printf("%d\n",p->data );
		else
			printf("%d\t",p->data );
		p=p->next ;
	}
	return L;
}


//转置链表内元素并输出
void InvertList(struct LNode *L)
{
	struct LNode *p,*q,*r,*s,*t;
	r = (struct LNode*)malloc(sizeof(struct LNode));     
	s = (struct LNode*)malloc(sizeof(struct LNode));
	r->next=NULL;                                         //建立一个带头结点新链表
	q=L->next;                                            //q指向链表第一个元素           
	s->data=q->data;
	s->next=NULL;
	r->next=s;
	while(q->next !=NULL)                                 
	{
		q=q->next;
    	p = (struct LNode*)malloc(sizeof(struct LNode));
    	p->data=q->data;
    	p->next=s;
    	r->next=p;
    	s=p;
	}
	printf("输出转置后的链表:\n");
	t=r->next;                              
	while(t!=NULL)                                        //直接输出转置后的链表            
	{
		printf("%d\t",t->data );
		t=t->next ;
	}
	printf("\n");
}


//主函数
int main()
{
	int n;
	struct LNode *L;
	L=CreatList(n);
	InvertList(L);
}

  • 11
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值