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语言
后所写,大家可以看一看。谢谢