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

话不多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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值