练习2.编写一个程序,功能为输入10个整数,将它们存储在一个动态链表中。再读入一个数n,将链表从第n个结点开始重组(即以第n个结点作为头结点,而将前n-1个结点平移至链表的末尾),并输出重组后的链表结果。要求:程序包含3个子函数,各函数要求如下:
- 子函数1:功能为创建包括10个结点的链表并读入数据;
形式为:struct LNode *creat(void);
- 子函数2:功能为平移(重组)链表;
形式为:struct LNode *move(struct LNode *head,int n);
其中:函数返回值为调整后的新“头指针”的地址;
- 子函数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;
}