话不多BB
#include<stdio.h>
#include<stdlib.h>
typedef struct List{
int x;
struct List *next;
}Node;//简化结构体指针的定义,就用一个Node代表了struct List。
Node *add(Node *head){
Node *p = NULL,*pr = head;//注意用两个指针,p是新建立的结构体,pr的作用是用来遍历整个链表的
int x;//定义结构体里面你想要的变量 ,后面赋值。
p = (Node*)malloc(sizeof(Node));//申请内存空间
if(p == NULL) {
printf("there is no enough space");//判定内存申请成功没,本帅还没有碰到过没申请成功的样子
exit(0);//退出程序
}
if(head == NULL) {
head = p;//head是个空指针嘛,就让第一个结构体成为头头。
}else {
while(pr->next != head) {
//这时候就用pr遍历整个链表,找到 链表末尾
pr = pr->next;//让pr不断向后推进
}
pr->next = p;//这时候pr已经指向了末尾了,就指向新建的结构体p
}
scanf("%d",&x);
p->x = x;//垃圾操作,就是输入数据
p->next = head;//让最后末尾指向头指针,开始疑惑这不是每个结点都指向了
//head了嘛,发现上面pr在遍历的时候就重新让上一个末尾的指针改变了。
return head;
}
void display(Node *head){
Node *p=head;
while (p != NULL) {
printf("%d",p->x);
p = p->next;
if(p == head) {
break;//循环一次就直接break,如果要循环多次就建立计数器break;
}
}
}
void deletelist(Node *head){
Node *p = head,*pr = NULL;
while (p!= NULL) {
pr = p;
p = p->next;
free(pr);
if( p == head) {
//与打印同理
break;
}
}
}
int main()
{
int x,y;
scanf("%d",&y);
Node *head = NULL;
for(int i = 0; i < y; i++){
head = add(head);
}
display(head);
deletelist(head);
return 0;
}