链表的创建和删除,初识链表

#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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值