#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct date//申明结构体
{
char str;
struct date *next;//用来指向下一个结构体指针
} date;
int main(void)
{
date *pS,*pE,*head = NULL;//定义三个结构体指针,head用来保存链头,pE保存链尾
date *Rhead = NULL;//定义读取结构体指针
pE = head;//刚开始没有任何结点,指向表头
char temp = 0;
do
{
scanf("%c",&temp);
if (temp != '#')
{
pS = (date*)malloc(sizeof(date));//新建结点
pS->str = temp;//给新结点赋值数据
pS->next = NULL;//让指向下一个为空(新结点,也就是新链尾)
if (head == NULL)//如果链表还没有任何结点存在
{
head = pS;//就把新结点地址给head
}
else
pE->next = pS;//把新结点连接到链尾
/*
第一次不执行,而到第二次pE就是上一次的pS
而pE->next让其指向下一次的pS
*/
pE = pS;//新结点成为了新的链尾
}
}
while (temp != '#');
printf("\n刚才输入的是:\n");
Rhead = head;//取得链头
/*
当然也可以直接用head不过这样就会改变其值,而无法再次查找链表
切忌链头的重要性,只要找不到链头,整条链表就没用!
*/
while (Rhead != NULL)//循环到链尾
{
printf("%c",Rhead->str);
Rhead = Rhead->next;//让其指向下一个链表
}
printf("(END)\n");//链表输出结束显示位置,输入时除了'#'外,空格等都会输入
/*
输入:1 2 3 4 5 6#
显示:1 2 3 4 5 6(END)
=========================>>区别在于6后面的空格
输入:1 2 3 4 5 6 #
显示:1 2 3 4 5 6 (END)
*/
date* p;
while (head!=NULL)//清除链表
{
p = head;//把要删除的链给临时变量
head= head->next;//先连
free(p);//后断
/*
不管是插入、删除节点,还是清除链表释放内存都要遵循"先连后断"
*/
}
getch();
return 0;
}
链表的创建和删除,初识链表
最新推荐文章于 2022-09-15 20:41:02 发布