上午搞了半天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一定是在一个格子的头和尾。