循环链表之初级菜鸟之摸鱼

话不多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;
}

猜你喜欢

转载自blog.csdn.net/weixin_51664705/article/details/110148660