一个简单的链表可以分为三部分
- ->增加链表节点
- ->查看链表节点
- ->释放节点
建立三个函数
- struct link* AppendNode(struct link* head); 添加节点
- void DisplyNode(struct link* head);查看节点
- void DeleteMemory(struct link* head);释放节点
在main函数中调用这三个函数,实现一个简单的链表.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct link* AppendNode(struct link* head);
void DisplyNode(struct link* head);
void DeleteMemory(struct link* head);
struct link
{
int data;
struct link* next;
};
int main() {
int i = 0;
char c;
struct link* head = NULL; //链表头指针
printf("是否添加一个新的节点(Y/N)?\n");
scanf(" %c", &c); //%c前面有一个空格
while (c == 'Y' || c == 'y')
{
head = AppendNode(head); //向head为头指针的链表末尾添加节点
DisplyNode(head); //显示当前链表中的信息
printf("你想要再添加一个节点吗(Y/N)?");
scanf(" %c", &c); //%c前面有一个空格
i++;
}
printf("%d 节点显示 \n", i);
DeleteMemory(head); //释放所有动态分配的内存
}
//函数功能:新建一个节点并添加到链表末尾,返回添加节点后节点后的链表的头指针
struct link* AppendNode(struct link* head)
{
struct link* p = NULL, * pr = head;
int data;
p = (struct link*)malloc(sizeof(struct link));//让p指向新建节点
if (p == NULL) //若为新建节点申请内存失败,则退出程序
{
printf("没有足够的空间\n");
exit(0);
}
if (head == NULL) //若原链表为空表
{
head = p; //将新建节点置为头结点
}
else //若原链表为非空,则将新建节点添加到表尾
{
while (pr->next != NULL) //若未到表尾,则移动pr直到pr指向表尾
{
pr = pr->next; //让pr指向下一个节点
}
pr->next = p; //让末点的指针域指向新建节点
}
printf("输入节点数据:");
scanf("%d", &data); //输入节点数据
p->data = data; //将新建节点置为表尾
p->next = NULL; //返回添加节点后的链表头指针
return head;
}
//函数的功能:显示链表中所有节点的节点号和该节点中的数据项内容
void DisplyNode(struct link* head)
{
struct link* p = head;
int j = 1;
while (p != NULL) //若不是表尾,则循环打印节点的值
{
printf(" % 5d % 10d\n", j, p->data); //打印第j个节点的数据
p = p->next; //让p指向下一个节点
j++;
}
}
//函数功能:释放head指向链表中所有节点占用的内存
void DeleteMemory(struct link * head)
{
struct link* p = head, * pr = NULL;
while (p != NULL) //若不是表尾,则释放节点占用的内存
{
pr = p; //在pr中保存当前节点的指针
p = p->next; //让p指向下一个节点
free(pr); //释放pr指向的当前节点占用的内存
}
}