C语言学习日志6#

上午搞了半天vpn,也没搞好谷歌账号,红温了

今天好好学习一下链表,书上内容肯定是要掌握好的。不要老想着Cplus,学好基础再去看那个。

昨天初步了解了一下链表是什么,今天要学习链表的具体应用。

如何create一个链表?

这是理解链表的关键,正确创建一个链表的步骤如下

#include<stdio.h>;
#include <stdlib.h>;//使用malloc()需要导入这个库
struct NODE 
{ int num; 
struct NODE* next; 
};

struct NODE *create(int n) {
	struct NODE* p1, * p2, *head;
	int i;
	p1 = (struct NODE*)malloc(sizeof(struct NODE));//申请内存,创建一个“表”
	scanf("%d", &p1->num);//申请之后要把内容放入存储空间,这里要注意p所指向的数据内容。
	head = p2 = p1;//建立头节点,把第一个表的头链搞出来
	for ( i = 0; i <n; i++)//建立n-1个节点
	{
		p1 = (struct NODE*)malloc(sizeof(struct NODE));//此时下一个节点已经创立,且有头
        scanf("%d", &p1->num);//输入对应内容
		p2->next = p1;//把第一个“表”连到下一个节点的头上
		p2 = p1;//消除中间变量,完成头的替代。
	}
	p2->next = NULL;//尾节点指向NULL

}

 接下来要遍历链表,比较easy

void print(struct NODE *head) //从头到尾遍历链表
{
	struct NODE* p;
	p = head;
	while (p!=NULL)
	{
		printf("%d", p->num);
		p = p->next;//指向下一个节点
	}
}

 插入节点就没那么好理解了,只能尽量感受

struct NODE* insert(struct NODE* head) //插入节点
{
	struct NODE* p, * pnew, * pold;
	pnew = (struct NODE*)malloc(sizeof(struct NODE));
	scanf("%d", &pnew->num);//建立新节点
	p = head;
	if (pnew->num > head->num) 
	{
		pnew->next=head ;//如果是最大的,就把head移到pnew的地址之后
		head = pnew;//head相当于一个标志,说明链表的起点。
	}
	else
		//如果不是最大的,就不用对head进行操作
		// 转而用p访问每个节点
		// 用pold记录访问过的节点
	{
		while (p != NULL && pnew->num < p->num) {
			pold = p;//记录访问过的节点
			p = p->next;//访问下一个节点
		}
		pnew->next = p;
		pold->next = pnew;
	}
}

 说实话这里还是有点懵为什么这么写,但是发现了把“=”看作指向性箭头可能会比较好理解。

最后一个就是删除节点了,搞完这个就完事,之后做下pta题目训练就行了(过时间就看菜鸟)

struct NODE* pdelete(struct NODE* head,int standard) //删除大于等于standard的节点
{
	struct NODE* p, * pold;
	p = head;
	while (head != NULL && p->num > standard);
	//如果链表头部满足条件,则逐个删除
	{
		head = head->next;
		free(p);
		p = head;
	}
	if (head == NULL) return head;
	p = head->next;
	pold = head;
	while (p != NULL ) {
		if (p->num < standard) {
			pold->next = p->next;//删除节点
			free(p);//释放内存
			p = pold->next;//指向下一节点
		}
		else
		{
			pold = p;
			p = p->next;
			//正常指向下一个节点
		}
	}
}

 脑子里一定要有链表的图,是一个从中间分开的格子,左边是具体值,右边是.next,指向某个节点。

p和p.next一定是在一个格子的头和尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值