数据结构练习——循环链表实验

c语言代码实现

注:函数功能和注释都在代码里


#include<stdio.h>
#include<stdlib.h>
//学生结构体
typedef struct
{
	int age;
	int height;
	double weight;
}Student;
//单链表节点类型
typedef struct node
{
	Student stu;
	struct node* next;
}Node;
//创建节点函数
Node* CreateNode(Student *stu)
{
	//申请一个节点空间
	Node* node = (Node*)malloc(sizeof(Node));
	//判断是否申请成功
	if (!node)return NULL;
	//初始化一个节点
	node->next = NULL;
	node->stu = *stu;
	//返回节点
	return node;
}
//输入节点信息函数
void InputValue(Student *stu)
{
	if (stu == NULL)return;
	printf("输入学生年龄,身高,体重\r\n");
	scanf_s("%d%d%lf", &stu->age, &stu->height, &stu->weight);
}

//创建单链表函数
Node *CreateLink()
{
	Student stu = { 0 };
	//创建一个头节点
	Node* head = CreateNode(&stu);
	if (!head)return NULL;
	//添加其他节点
	int tag = 0;
	printf("添加其他节点,如果是输入1,否则输入0\r\n");
	scanf_s("%d", &tag);
	Node* tail = head;
	Node* pnew;
	while (tag!=0)
	{
		InputValue(&stu);
		pnew = CreateNode(&stu);
		if (!pnew)return NULL;
		tail->next = pnew;
		tail=pnew;
		printf("添加其他节点,如果是输入1,否则输入0\r\n");
		scanf_s("%d", &tag);
	}
	tail->next = head;//构成循环单链表
	//返回节点
	return head;

}
//销毁单链表函数
int DeleteLink(Node *head)
{
	if (!head)return 0;
	//如果为非空,则逐个释放
	Node * p, * q;
	p = head;
	while (p->next != NULL && p->next!=head)
	{
		q = p->next;
		p->next= q->next;
		free(q);
	}
	free(head);
	return 1;
}
//打印学生信息函数
void DisplayValue(Student *stu)
{
	if (!stu)return;
	printf("age=%5d,height=%5d,weight=%5lf\r\n", stu->age, stu->height, stu->weight);

}

//遍历循环链表函数
void DisplayLink(Node * head)
{
	if (!head)return;
	Node* p=head->next;
	for (p=head->next;p != head ;p=p->next )
	{
		DisplayValue(&p->stu);
	}
}
//在指定位置插入节点函数
void InsertNode(Node *head,Node *pnew,int add)
{
	//判断是否为空
	if (!head|| !pnew)return;
	if (add < 0)return;
	//找到插入位置
	Node* p = head;
	int i = 0;
	for (i=0; i < add && p->next != head; i++)
	{
		p = p->next;
	}
	if (p->next == head && i<add)return;//插入位子超出范围
	pnew->next = p->next;
	p->next = pnew;

}
//在指定位置删除节点函数
void DeleteNode(Node *head,int add)
{
	if (!head)return;
	Node* p=head;
	Node* q;
	for (int i = 0; i < add && p->next != head; i++)
	{
		p = p->next;
	}
	if (p->next == head)return;//删除节点超出范围
	q = p->next;
	p->next = q->next;
	free(q);
}
int main()
{
    //创建链表
	Node* head = CreateLink();
    //显示链表所有节点信息
	DisplayLink(head);
	
    //在链表指定位置插入节点
	Student stu = { 4,4,4 };
	InputValue(&stu);
	Node* pnew = CreateNode(&stu);
	InsertNode(head, pnew,1);
	printf("插入新节点后的单链表\r\n");
	DisplayLink(head);
    
	//在链表指定位置删除节点
	DeleteNode(head,3);
	printf("删除节点后的单链表\r\n");
	DisplayLink(head);

    //释放链表空间
	DeleteLink(head);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值