严蔚敏数据结构P35——循环链表的建立和输出(书中无实例,本程序为帮助理解)

严蔚敏数据结构P35——循环链表的建立和输出
(书中无实例,本程序为帮助理解)

/*
严蔚敏数据结构P35——循环链表的建立和输出(书中无实例,本程序为帮助理解)
*/

//头文件
#include<stdio.h>
#include<stdlib.h>

//链表结构
typedef	struct st											//循环链表st的结构
{
	int data;												//数据域
	struct st * NEXT;										//指针域
}List, *sqlist;

void build_list(sqlist H)									//建立链表
{
	int i, date, len;

	sqlist t = NULL, q = NULL;								//定义两个操作指针,t用于指向新开辟的结点,q指向新开辟结点的上一个结点 
	
	t = H->NEXT;											//将t指向第一个结点
	q = H;													//将q获得头指针的权限

	printf("输入你要建立链表的个数:");						//提醒用户输入相对应的数据
	scanf_s("%d", &len);									//记录需要开辟的结点个数

	for (i = 1;i <= len;i++)								//循环开辟结点并挂起	
	{
		printf("请输入第%d个数据:", i);					//提醒用户输入相对应的数据
		scanf_s("%d", &date);								//记录新结点的元素数据
		
		t = (sqlist)malloc(sizeof(List));					//新开辟的结点用t指向
		if (!t)												//如果t为空(即是开辟失败)
		{
			printf("检查程序,建立链表中开辟新结点有误\n"); //提醒用户错误发生地
			exit(1);										//非正常终止程序
		}

		t->data = date;										//将数据写入新开辟的结点的数据域
		t->NEXT = NULL;										//将新开辟结点的指针域挂起

		q->NEXT = t;										//将新开辟结点的挂到上一个结点上
		q = t;												//将q指向新结点以便于下一次的操作
	}

	t->NEXT = H->NEXT;										//将链表尾结点挂在第一个结点上(不是头结点),构成循环链表
}

void print(sqlist H)										//链表的遍历
{
	sqlist t = NULL;										//定义操作指针

	t = H->NEXT;											//将头指针指向第一个元素

	printf("\n循环链表的元素为:");					
  	 do														//因为需要有个限定条件为(尾结点的下一个结点不是第一个元素),采用do...while
	{
		printf("%d ", t->data);								//输出各个结点的数据域
		t = t->NEXT;										//将t指向下一个结点
	 } while (t != H->NEXT);								//判断(尾结点的下一个结点不是第一个元素)是否为真

	 printf("\n");
}

//主函数
int main(void)													
{	
	sqlist H;																//定义头指针

	H = (sqlist)malloc(sizeof(List));										//建立头结点
	H->NEXT = NULL;															//将头结点的指针域挂起

	build_list(H);															//建立链表
	print(H);																//遍历链表

	return 0;
}

循环链表的建立:

void build_list(sqlist H)									//建立链表
{
	int i, date, len;

	sqlist t = NULL, q = NULL;								//定义两个操作指针,t用于指向新开辟的结点,q指向新开辟结点的上一个结点 
	
	t = H->NEXT;											//将t指向第一个结点
	q = H;													//将q获得头指针的权限

	printf("输入你要建立链表的个数:");						//提醒用户输入相对应的数据
	scanf_s("%d", &len);									//记录需要开辟的结点个数

	for (i = 1;i <= len;i++)								//循环开辟结点并挂起	
	{
		printf("请输入第%d个数据:", i);					//提醒用户输入相对应的数据
		scanf_s("%d", &date);								//记录新结点的元素数据
		
		t = (sqlist)malloc(sizeof(List));					//新开辟的结点用t指向
		if (!t)												//如果t为空(即是开辟失败)
		{
			printf("检查程序,建立链表中开辟新结点有误\n"); //提醒用户错误发生地
			exit(1);										//非正常终止程序
		}

		t->data = date;										//将数据写入新开辟的结点的数据域
		t->NEXT = NULL;										//将新开辟结点的指针域挂起

		q->NEXT = t;										//将新开辟结点的挂到上一个结点上
		q = t;												//将q指向新结点以便于下一次的操作
	}

	t->NEXT = H->NEXT;										//将链表尾结点挂在第一个结点上(不是头结点),构成循环链表
}

循环链表的遍历:


void print(sqlist H)										//链表的遍历
{
	sqlist t = NULL;										//定义操作指针

	t = H->NEXT;											//将头指针指向第一个元素

	printf("\n循环链表的元素为:");					
  	 do														//因为需要有个限定条件为(尾结点的下一个结点不是第一个元素),采用do...while
	{
		printf("%d ", t->data);								//输出各个结点的数据域
		t = t->NEXT;										//将t指向下一个结点
	 } while (t != H->NEXT);								//判断(尾结点的下一个结点不是第一个元素)是否为真

	 printf("\n");
}

注意:
(1)循环链表核心挂起的操作:

		t->data = date;										//将数据写入新开辟的结点的数据域
		t->NEXT = NULL;										//将新开辟结点的指针域挂起

		q->NEXT = t;										//将新开辟结点的挂到上一个结点上
		q = t;			

(2)遍历的循环和限制条件:

	 do														//因为需要有个限定条件为(尾结点的下一个结点不是第一个元素),采用do...while
	{
		printf("%d ", t->data);								//输出各个结点的数据域
		t = t->NEXT;										//将t指向下一个结点
	 } while (t != H->NEXT);	

因为需要有个限定条件为(尾结点的下一个结点不是第一个元素),采用do…while。

感谢观看

再次感谢~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值