循环链表小练习
上完课顺便练习循环链表的创建以及输出
# include <stdio.h>
typedef struct List{
int data;
struct Node * next;
}Node,*LinkList;
int main (){
LinkList head ,p ,q , k,start;
head = (LinkList) malloc (sizeof(Node));//为头结点创建空间
int n,num=0;//
scanf("%d",&n);//定义链表的长度
q = head;//q代替head的位置 ,q作为临时保存头结点的指针,防止头结点被覆盖后,找不回来
while (n --){//
p = (LinkList) malloc (sizeof(Node));//,为当前节点p开辟空间
scanf("%d",&p->data);//循环输入链表中的每一个值
p->next = head->next;//
head->next = p;//
head =p;//
}
//通过一个循环的移动,head此时已经移动到了尾部
head->next = q->next;//此时再将之前临时保存的头结点q拿出来 ,完成收尾相连的工作
//free(head);
/*到这之后就建立好了,后续工作就是输出操作以及优化*/
start = q->next;//start可以理解为第一个节点,就是开始的地方 ,q当前还是头结点
k = start->next;//此时,k被赋予了第二个节点的值
while (1){//
printf ("%d ",k->data);//此时输出的是第二个节点的值
num ++;//计数器加一
k = k->next;//k的值往下移动一位
if(k == start){//如果k移动到了start (也就是第一个节点的位置)
printf ("%d ",k->data);//就输出第一个节点的值
num++;//计数器再加一
break;//跳出循环
}
}
printf ("\n%d ",num);//
return 0;//
}