链表(3)链表的移动

练习2.编写一个程序,功能为输入10个整数,将它们存储在一个动态链表中。再读入一个数n,将链表从第n个结点开始重组(即以第n个结点作为头结点,而将前n-1个结点平移至链表的末尾),并输出重组后的链表结果。要求:程序包含3个子函数,各函数要求如下:

  1. 子函数1:功能为创建包括10个结点的链表并读入数据;

形式为:struct LNode *creat(void);

  1. 子函数2:功能为平移(重组)链表;

形式为:struct LNode *move(struct LNode *head,int n);

其中:函数返回值为调整后的新“头指针”的地址;

  1. 子函数3:功能为输出链表中的所有结点;

形式为:void print(struct LNode *head);

运行结果示例:

 


#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(NUM)
 typedef   struct num
{
	int digit;
	struct num*next;//先改个名,就叫做NUM,顺便定义结构体变量中的数字,以及通用的*next 
 } NUM;

int n=0;
  NUM *creat(void)
  {
  	NUM *head,*p1,*p2;
  	int i;
  	n=0;
  	p1=p2=(NUM*)malloc(LEN);
	  for(i=0;i<10;i++)
	  {
	  	n++;
	  	p2=(NUM*)malloc(LEN);
	  	scanf("%d",&p2->digit);
	  	if(i==0)
	  	head=p2;
	  	else
	  	p1->next=p2;
	  	p1=p2;
	   } 
	   p1->next=NULL;
	   return (head); 
}
NUM *move(NUM *head,int n) //链表的移动 
{
    NUM *p1=head,*p2=head;//用两个指针接着head,p1指针 
	int i;
	
	if(n>1)
	{
		for(i=1;i<n-1;i++)//执行n-2次循环 ,从链表的第一个节点开始访问,访问到第n-2个节点结束 
		p1=p1->next;//p1从头开始不断下跳 
		p2=p1->next;//到此为止已经进行了前n-1个节点的访问 
		p1->next=NULL;//把当前第n-1个节点作为新的链表的末节点 
		p1=p2;//开始生成前半部分链表, 
		while(p1->next!=NULL)
		p1=p1->next;//p1指针不断下跳,知直到进行到链表的末尾 
		p1->next=head;//把链表分散的部分进行串联 
	}
	return p2;
}
 void print(NUM *head)
 {
 	NUM *k=head;//定义一个新的指针k。让他作为头指针 
 	if(k==NULL)//如果指向为空,则是空链表 
 	{
 		printf("This is an empty list.");
	 }
 	while(k!=NULL)//如果指向不是空的 
 	{
 	
 		printf("%d ",k->digit);//那么就输出当前指针所指着的数字,然后指针下跳,直到最后一个单元 
 		k=k->next;
	 }
 }
 int main()
   {
   	NUM *head;
   	printf("输入10个整数:");
   	head=creat();
   	printf("输入n值<1-10>:"); 
   	scanf("%d",&n);
   head=move(head, n);
   	printf("输出链表结果:"); 
   	print(head); 
    return 0;
	} 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值