严蔚敏数据结构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。
感谢观看
再次感谢~