首先,链表的一些概念相信大家都已经知道了,这边不再赘述。
这里说出我的理解
链表就是磁带,你把链表想成磁带就可以了
链表的每个节点就像是磁带里面的每个听力单元。
那么,我们首先利用结构体创建一个这样的单元
typedef struct node
{
int name;
struct node* next;
}Node;
一个链表的节点包括两个部分:1 数据本身 2 指向的地址;
那么,我们改如何创建一个链表呢?
想象一下,我们现在想要戏弄一下英语老师,在听力材料中插入一段自己的讲话。
那么,我们首先需要生成自己讲话的录音带
//创建链表头结点
Node* p = (Node*)malloc(sizeof(Node));
//创建读写装置
Node* head, * tail;
head = p;
tail = p;
tail->next = NULL;
//开始创建一个链表;
for (int i = 0; i < 5; i++)
{
p = (Node*)malloc(sizeof(Node));
p->name = i;
//左限位不动,尾指针发生变化
tail->next = p;//上一个结点的指针指向这个结点;
tail = p;//这个节点也变成了尾结点
tail->next = NULL;
}
//写入完毕,读写头归位
这边创建了三个结构体指针,这三个结构体指针我给他取名字叫 头指针 尾指针 读写头指针
然后呢?
然后看上面的for循环,我们不断地创建节点,然后不断把节点连在了一起。
我们现在创建的这一段录音带假如就是老师的录音带,那么我们现在应该如何插入呢?
首先,我们需要录下自己的音
int num;
Node* pa;
pa = (Node*)malloc(sizeof(Node));//创建空间
printf("请插入数字>>");
scanf("%d", &(pa->name));
printf("请选择插入你想插入在哪个数字后面>>");
scanf("%d", &num);
这里我们创建了一块空间作为一个新的结点,这块节点现在已经被我们输入了需要输入的数据,并且,我们想要插入的地方也需要明确
那么问题来了,假设我们需要在第三单元的听力后面插入自己的录音,我们怎么找到第三单元?
大家记得英语老师是怎么做的吧:从头开始快进听
while (p != NULL)
{
if (p->name == num)
{
pa->next = p->next;//新节点的指向和老街店一样
p->next = pa;//老结点指向新结点;
}
p = p->next;
}
p = head->next;
像是上面的代码一样,我们必须从链表的头部开始找到指定的位置。并且把这块新的结点连接进去
并且,这里值得注意的是,在使用完链表之后一定要让读写头也就是读写指针P回到原位。要不然下次就读不到链表了。
整体代码如下
typedef struct node
{
int name;
struct node* next;
}Node;
int main()
{
//创建链表头结点
Node* p = (Node*)malloc(sizeof(Node));
//创建读写装置
Node* head, * tail;
head = p;
tail = p;
tail->next = NULL;
//开始创建一个链表;
for (int i = 0; i < 5; i++)
{
p = (Node*)malloc(sizeof(Node));
p->name = i;
//左限位不动,尾指针发生变化
tail->next = p;//上一个结点的指针指向这个结点;
tail = p;//这个节点也变成了尾结点
tail->next = NULL;
}
//写入完毕,读写头归位
p = head->next;//因为有效位置是从第二个节点开始的
while (p != NULL)
{
printf("%d -->", p->name);
p = p->next;
}
p = head->next;
//开始插入
while (1)
{
int num;
Node* pa;
pa = (Node*)malloc(sizeof(Node));//创建空间
printf("请插入数字>>");
scanf("%d", &(pa->name));
printf("请选择插入你想插入在哪个数字后面>>");
scanf("%d", &num);
while (p != NULL)
{
if (p->name == num)
{
pa->next = p->next;//新节点的指向和老街店一样
p->next = pa;//老结点指向新结点;
}
p = p->next;
}
p = head->next;
while (p != NULL)
{
printf("%d-->", p->name);
p = p->next;
}
p = head->next;
}
}