您的位置:首页 > 编程语言 > C语言/C++

C语言学生管理系统(准备工作2)(有空头单链表-创建节点-头尾添加)

2020-03-04 23:45 573 查看

单链表

说实话写这个时候心里是没底的,因为我也是刚刚学会没多久,仅仅是保证运行不出错,也不清楚自己理解了多少,但还是决定把现阶段自己所理解的都总结下来,也方便以后查缺补漏,话不多说,开始吧!

首先回想一下链表的样子:

链表不同于数组,它没有索引(下标),所以当我们需要使用链表的时候,总是要从第一个节点开始遍历,到最后一个节点(指针指向NULL的节点)结束。

所以我们一般会用两个指针指向这两个节点——头节点和尾节点,也就是头指针和尾指针,而在具体应用过程中,可以让头指针指向第一个装有数据的节点(这样它就是头节点了),也可以单独给头指针创建一个不装数据的节点(专门作为头节点)。

像这样的   第一种情况就是无空头的链表
                  第二种就是有空头的链表
我试着画一下:
无空头链表

有空头链表

我下面总结的是有空头的链表,它比较好理解也更好操作一些,首先需要声明节点结构体,如下:

struct Node
{
int data;		//数据

struct Node* pNext;		//指针
};

然后定义头尾指针并赋空:

struct Node* Head = NULL;
struct Node* End = NULL;

在使用时,还要需要在主函数中为头指针创建一个节点(空头),将指针赋空,为了方便操作,顺便让尾节点也等于它。

int main(void)
{
Head = (struct Node*)malloc(sizeof(struct Node));
Head->pNext = NULL;
End = Head;

system("pause");
return 0;
}

这样,写一个链表的准备工作就准备好了,接下来就是去写各种各样的函数来实现各种功能了,链表的基本操作是“增删改查”,下面我一个一个总结。
向链表中添加节点有三种方法,头添加、尾添加和在指定位置添加(在指定位置之前或之后,有自己决定……或者你也可以两种都写)

其实单看名字就已经很好理解了,但我还是画上三张图吧:
尾添加

头添加

注意操作顺序是先连后断,如果先让Head->pNext指向pTemp的话,就没办法找到Head的下一个了,因为此时那根“链”已经断了
理解了头添加的话,在指定位置添加也就简单很多了

在指定位置添加

看完了上面三种添加方法,你会发现他们都需要创建一个新的节点pTemp,想象这三种方法我们都需要使用,那同样的创建节点我们就要写三遍了,所以不如干脆把它拿出来重新写一个函数,创建一个节点并返回就好了:

struct Node* CreateNode(int a)
{
struct Node*pTemp= (struct Node*)malloc(sizeof(struct Node));
pTemp->data = a;
pTemp->pNext = NULL;
return pTemp;
}

今天就暂时总结这么多吧,下面是具体所有代码(这里我没有写在指定位置添加,明天我会把它和选择指定节点一起写出来):

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

struct Node
{
int data;		//数据

struct Node* pNext;		//指针
};
struct Node* Head = NULL;
struct Node* End = NULL;
struct Node* CreateNode(int a);
void AddList_Head(int a);
void AddList_Tail(int a);
void ScanList();

int main(void)
{

Head = (struct Node*)malloc(sizeof(struct Node));
Head->pNext = NULL;
End = Head;

AddList_Tail(1);
AddList_Tail(3);
AddList_Tail(5);
AddList_Head(7);
AddList_Head(9);

ScanList();//这是遍历输出链表中所有节点的内容,今天没有写,主要是为了演示结果

system("pause");
return 0;
}

struct Node* CreateNode(int a)
{
struct Node*pTemp= (struct Node*)malloc(sizeof(struct Node));
pTemp->data = a;
pTemp->pNext = NULL;
return pTemp;
}
void AddList_Head(int a)
{
struct Node* pTemp = CreateNode(a);
pTemp->pNext = Head->pNext;
Head->pNext = pTemp;
}

void AddList_Tail(int a)
{
struct Node* pTemp = CreateNode(a);
End->pNext = pTemp;
End = pTemp;
}

这是三次尾添加和两次头添加的结果

可以看到头添加之后的顺序都是反的,所以我们一般都使用尾添加。

嘿嘿,未完待续~~

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Kz_Ghost 发布了10 篇原创文章 · 获赞 0 · 访问量 158 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐