题目
代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node;
node *creat(int n)
{
node *p = NULL,*s,*head;
int i =1;
head =(node *)malloc(sizeof(struct node));
p = head;
if(n!=0)
{
for(;i<=n;i++)
{
s = (node *)malloc(sizeof(struct node));
s->data = i;
p->next = s;
p = s;
}
s->next = head->next;
free(head);
free(p);
}
else
{
exit(0);
}
return s->next;
}
int main()
{
int m=3,n=41,i =1;
node *p = creat(n),*temp;
n%=m;
while(p!=p->next)
{
for(;i<m-1;i++)
{
p=p->next;
}
i =1;
printf("%d->",p->next->data);
temp=p->next;
p->next = temp->next;
free(temp);
p = p->next;
}
printf("%d\n",p->data);
return 0;
}
问题一
解释:通过移动节点p,每次p=s;相当于节点p移动到下一个s,然后p->next=s,就是上一个s->next=下一个s的头,实现链表相连,而移动节点不断往后移动,直到最后一个s,然后首尾相连s->next = head->next;
问题二
解释:移动节点p移动到第二个节点,打印出第三个节点的数据,temp=p->next;(记录第三个节点)p->next = temp->next;(第二个节点的屁股=第四个节点的头)free(temp);p = p->next;