前言
本系列文章是笔者学习数据结构的笔记,如有不妥之处欢迎指正
目录
- 链表的实现借助了动态内存只要不手动释放就会一直生效的特点
- 本代码使用了函数来方便较为清晰地演示链表的创建与打印,实际都在主函数中也可
- 有效节点: 存放数据的节点
#include<stdio.h>
#include<stdlib.h>
struct NODE
{
int data; //数据域
struct NODE *Next; //指针域
};
struct NODE * creat(int n); //创建链表函数
void display(struct NODE *head); //显示链表内容函数
int main()
{
int n;
scanf("%d",&n); //输入需要创建的链表有效节点的个数
struct NODE *head = NULL; //创建一个指针用充当两个函数的“桥梁”
head = creat(n);
display(head);
return 0;
}
struct NODE * creat(int n) //接收需要创建链表有效节点的数量
{
int i; //定义一个循环变量i用于创建链表的各有效节点
struct NODE *head = (struct NODE *)malloc(sizeof(struct NODE));
struct NODE *tail;
tail = head; //令tail指向head所指向的区域,即tail和head指向同一块区域,后续仅操作tail
tail->Next = NULL; //令该结构的Nex指针成员指向空,链表初始化完成
for(i=0;i<n;i++)
{
struct NODE *t = (struct NODE *)malloc(sizeof(struct NODE)); //定义一个新的结构作为链表创建过程中的数据暂存体
scanf("%d",&t->data); //输入数据
tail->Next = t; //令链表主体的尾部节点指向新加入有效节点(尾部插入)
t->Next = NULL; //此时新节点成为链表的最后一个节点,令其指针域指向空
tail = t; //将“尾节点指针”指向链表的“最后一个节点”,
// 注意此处所有的变量均为“指针类型”,更改其指向并不影响任何链表中的实际内容
}
return head;
}
void display(struct NODE *head)
{
struct NODE *p = head ->Next; //创建一个指针指向需要输出内容的节点
while (p != NULL)
{
printf("%d ",p->data);
p=p->Next; //每输出一个节点的内容就令其后移一位
}
}
输入
3
1 2 3
输出
1 2 3