个人复习:链表知识

1.何为链表?

在数据储存时,数据在空间上并不是“排排坐”有序的存放的,为了保证数据上的顺序性,我们用结构体来存放数据,一个结构体上有1.数据(data)(也就是数据域)2.指向下一个数据的指针(next)(也就是指针域)俩部分组成,我们将其称结点,将这些结点(用指针)连在一起,就成了链表。

个人理解:我们想像一个结点是一个这样的物品

矩形代表着我要存储的数据(data),后面那个钩子代表着指向下一个结点的指针(next),而那个圆圈,就是我们这个结点的地址!我们将他们一个扣一个(就是指向下一个结点的指针连在一起,就变成这样↓

这就是链表。

最后一个钩子就是表尾,他指向“NULL”。

代码如下

typedef struct Node{
	int data; //数据域
	struct Node *next;//指针域
}Node;

2.链表的创建

1.头结点&头指针&首元结点

        首先说明最重要一点!链表可以没有头结点,但一定要有头指针

        头指针就是告诉你,我们创建的链表在哪里,有头结点呢就是划分了一个物理空间来给你放你的链表,无头结点呢就是声明了你有一个链表

        首元结点即为你存放第一个元素的结点。

2.创建链表

        第一种:我们只要创建一个表头(即头结点),后面想添加数据就拿一个一个结点往上扣就好了嘛(滑稽

Node *creat(){
	Node * headNode=(Node*)malloc(sizeof(Node));//给他划一块空间
	headNode->next= NULL;//后面的结点还没挂上去,指向空 
	return headNode; 
}

然后创建一个新的普通的结点

Node *normalNode(int data){
	Node * newNode=(Node*)malloc(sizeof(Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode;
}

(多个结点我们一手快乐for循环)

然后挂上去(我们假设表头变量是list,有一个结点是node1)

只要将list的指针指向node1即可,代码我就不放出了。

       第二种:矮油,第一种方法好麻烦哦,我们知道这个链表上有几个结点,然后用循环直接挂好这个链表再创好嘛

        可以的,代码如下

Node *creatlist(int n){
	Node *head,*node,*end;
	head = (Node*)malloc(sizeof(Node));
	end=head;
	for(int i=0;i<n;i++){
		Node * node=(Node*)malloc(sizeof(Node));
		scanf("%d",&node->data);
		end->next=node;
		end=node;
	}
	end->next = NULL;
	return head;
}

(这里开始有点难懂,要琢磨琢磨)

3.链表的操作

我也只会一点点

1.链表的插入

比如我们想将结点(小黄)插入链表结点1和2之间

我们只需要将结点一和结点二相扣的地方解开,将小黄扣进去就好

 

 代码如下

void charu(Node *headNode, int n){//n为要插在第n个结点后边 
	Node *p= headNode,*node;
	int i=0;
	while(i<n&&p!=NULL){
		p= p->next;
		i++;
	}
	if(p!=NULL){
		node=(Node*)malloc(sizeof(Node*));
		//加个提示方便知道干啥
		printf("输入插入的值\n"); 
		scanf("%d",&node->data);
		node->next=p->next;
		p->next = node;
	}
	else {
		printf("该结点不存在\n");
	}
}

2.链表结点的删除

就是上面反过来咯,假设要拆掉小黄,就解开小黄和结点1和2的相扣,拿出来,将结点1和2相扣

 代码如下

void shanchu(Node *headNode,int n){//n为要删除第n个后面那个结点
	Node *p= headNode,*node;
	int i=0;
	while(i<n&&p!=NULL){
		p = p->next;
		i++;
	}
	if(p!=NULL){
		node->next=p->next;
		free(t);//直接释放掉不要的空间 
	}
	else{
		printf("该结点不纯在\n");
	} 
}

3.输出链表

其实我学到这里才觉得链表有意思,直接一个个读出了就完事啦

void shuchu(Node *headNode){
	Node *p = headNode;
	while(p!=NULL){
		printf("%d",p->data);
		p=p->next;
	}
}

最后

这本是我方便以后复习,但是心血来潮想写文章,若有不足多多指出

注:本篇为学习了b站:1个小时学会单链表,C语言数据结构专题_哔哩哔哩_bilibili

                           csdn:c语言链表详解(超详细)_Endeavor_G的博客-CSDN博客_链表c语言

后所写,大家可以看一看。谢谢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值