前言:在存储一大波数的时候我们通常用的是数组,但有时候数组显得不太灵活
例如:从小到大排好的一串数字:2 3 5 8 9 10 18 26 32,我们要插入6使得其顺序依然不变,如果用数组的话就要让8以及8往后的数都要往后挪一位,很浪费时间,但如果用链表操作只需要将5的指针指向6的指针,再将6的指针指向8,这样一组数字就串起来啦!
(对指针不了解的朋友建议学习链表之前先了解指针)
—————————————————————————————————
- 链表是由一种叫做节点的结构体类型构成的。
- 下面我们来进行操作。在链表中输入n个数,并将其输出:
#include <stdio.h>
#include<stdlib.h> //使用malloc函数需要用到的头文件
struct node
{
int data;
struct node *next;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct node *head, *p, *q, *t;
int i, n, a;
printf("请输入数据个数:");
scanf("%d", &n);
printf("\n");
head = NULL;//头节点为空
printf("请输入数据:");
for (i = 1; i <= n; i++)//循环读入n个数
{
scanf("%d", &a);
//动态申请一个空间,用来存放一个节点,并且临时指针p指向这个节点
p = (struct node*)malloc(sizeof(struct node));
p->data = a;//将数据存放在当前节点的data域中
p->next = NULL;//设置当前节点的后继指针指向空,也就是当前节点的下一节点为空
if (head == NULL)
{
head = p;//如果这是第一个创建的节点,则头指针指向这一节点
}
else
{
q->next = p;//如果这不是第一个节点,则上一节点的后继指针指向该节点
}
q = p;//指针q也指向该节点
}
printf("\n");
t = head;
//输出链表中的所有数
printf("链表中的数据为:");
while (t != NULL)
{
printf(" %d", t->data);
t = t->next;//继续指向下一个节点
}
return 0;
}
结果:
- 插入操作代码:
在上述代码中新增的代码是:
printf("请输入插入的数:");
scanf("%d", &a);//读入待插入的数
printf("\n");
t = head;//从链表的头部开始遍历
while (t != NULL)
{
if (t->next == NULL || t->next->data > a)//如果当前一个节点 是最后一个节点或者下一个节点的值大于待插入数的时候插入
{
p = (struct node*)malloc(sizeof(struct node));//动态申请一个空间,用来存放新的节点
p->data = a;
p->next = t->next;//新增节点的后继指针指向当前节点的后继指针所指向的节点
t->next = p;//当前节点的后继指针指向新增节点
break;//插入完毕退出
}
t = t->next;//继续下一个节点
}
- 完整代码:
#include <stdio.h>
#include<stdlib.h> //使用malloc函数需要用到的头文件
struct node
{
int data;
struct node *next;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct node *head, *p, *q, *t;
int i, n, a;
printf("请输入数据个数:");
scanf("%d", &n);
printf("\n");
head = NULL;//头节点为空
printf("请输入数据:");
for (i = 1; i <= n; i++)//循环读入n个数
{
scanf("%d", &a);
//动态申请一个空间,用来存放一个节点,并且临时指针p指向这个节点
p = (struct node*)malloc(sizeof(struct node));
p->data = a;//将数据存放在当前节点的data域中
p->next = NULL;//设置当前节点的后继指针指向空,也就是当前节点的下一节点为空
if (head == NULL)
{
head = p;//如果这是第一个创建的节点,则头指针指向这一节点
}
else
{
q->next = p;//如果这不是第一个节点,则上一节点的后继指针指向该节点
}
q = p;//指针q也指向该节点
}
printf("\n");
printf("请输入插入的数:");
scanf("%d", &a);//读入待插入的数
printf("\n");
t = head;//从链表的头部开始遍历
while (t != NULL)
{
if (t->next == NULL || t->next->data > a)//如果当前一个节点 是最后一个节点或者下一个节点的值大于待插入数的时候插入
{
p = (struct node*)malloc(sizeof(struct node));//动态申请一个空间,用来存放新的节点
p->data = a;
p->next = t->next;//新增节点的后继指针指向当前节点的后继指针所指向的节点
t->next = p;//当前节点的后继指针指向新增节点
break;//插入完毕退出
}
t = t->next;//继续下一个节点
}
//输出链表中的所有数
t = head;
printf("链表中的数据为:");
while (t != NULL)
{
printf(" %d", t->data);
t = t->next;//继续指向下一个节点
}
return 0;
}
结果: