检测你到底有没有真正理解C语言的地址和指针和形式变量的关系之代码最少的链表但是坑最多的链表的写法

链表首先必须要创建由于直接写链表的创建那么很难知道他的原理是什么样的

所以这是链表的头插法
即 输入 1 2 3 他创建的链表却是 3->2->1的形式

那么先写头插法 比较利于理解接下来的极简的链表的创建的方法

#include<stdio.h>
#include<stdlib.h>
struct lb{
	int nur;
	struct lb* next;
};
void create_lb(struct lb** head){
	int n;
	printf("请输入要创建的链表的个数:");
	scanf("%d",&n);   // 输入要创建的链表的个数
	while(n-- > 0){
		struct lb*p = malloc(sizeof(struct lb));
		printf("输入数字:");
		scanf("%d",&(p->nur));
		p->next = *head;
		*head = p;
	}
}

void output(struct lb*head){
	while(head){
		printf("%d ",head->nur);
		head = head->next;
	}
}

int main(void){
	struct lb*head = NULL;  //首先将head 初始化为NULL 因为还没数据
	create_lb(&head);    //至于为什么要传入head 的指针 因为写不下了后面写
	output(head);
}

至于为什么要传入head 的指针 因为head 在main 函数里面首先是指向空的
在这里插入图片描述
p分配了地址

p------>|1_|head_|
*head = p;
很好理解吧 算了不画了
至于为什么传入head的指针 因为他要一直指着新插入数据的地址
理解了头插法 那么正着写链表也就很简单了
既然 最后一步是 *head = p 接下来是将新的数据插入到p 的前面
那么 *head = p->next 不就是将数据插入到 p->next 的前面吗
所以很好写了

不得不说我靠 这样的链表简直神奇了
#include<stdio.h>
#include<stdlib.h>
struct lb{
	int nur;
	struct lb*next;
};

void create(struct lb ** head){
	int n;
	scanf("%d",&n);
	while(n-- > 0){
		struct lb* p = malloc(sizeof(struct lb));
		scanf("%d",&(p->nur));
		p->next = *head;
		*head = p;
		head = &(p->next);
	}
}

void output(struct lb * head){
	
	while(head){
		printf("%d ",head->nur);
		head = head->next;
	}
}

int main(void){
	struct lb* head = NULL;
	create(&head);
	output(head);
	return 0;
}

原本想要解释一下的突然发现实在是太简单就不说了

再写一下删除 这里面也是有一点坑不过要使真的把地址 变量什么都搞清楚那也就简单了
#include<stdio.h>
#include<stdlib.h>
struct lb{
	int nur;
	struct lb*next;
};

void create(struct lb ** head){
	int n;
	scanf("%d",&n);
	while(n-- > 0){
		struct lb* p = malloc(sizeof(struct lb));
		scanf("%d",&(p->nur));
		p->next = *head;
		*head = p;
		head = &(p->next);
	}
}
void delet(struct lb** head){
	int n;
	printf("请输入你想要删除的数字");
	scanf("%d",&n);//不考虑找不到的情况实际上也很简单
	while((*head)->nur != n){
		head = &((*head)->next);
	}
	struct lb* tmp = *head;
	*head = (*head)->next;
	free(tmp);
}
void output(struct lb * head){
	
	while(head){
		printf("%d ",head->nur);
		head = head->next;
	}
}

int main(void){
	struct lb* head = NULL;
	create(&head);
	output(head);
	delet(&head);
	output(head);
	return 0;
}

这个删除的函数也实在是坑 不过不想打字了 我想要去看视频了所以就不解释了 额 拜拜
嗯还有 添加什么的没有什么特别的所以就不屑了 万能 万能嗯 白

发布了37 篇原创文章 · 获赞 0 · 访问量 370

猜你喜欢

转载自blog.csdn.net/weixin_43191153/article/details/102983377