设计单循环链表

**

设计单循环链表

**


(1)实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。
(2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。

在这里插入图片描述

本文为博主原创文章,未经博主允许不得转载。
版权为陈博超所有,第一次于2021年04月13日发表于BLOG上
本BLOG上原创文章未经本人许可,不得用于商业用途。转载请经允许后注明出处,否则保留追究法律责任的权利。
*

#include<stdio.h>
#include<malloc.h>
typedef int DataType;

typedef struct Node
{
	DataType Data;
	struct Node* next;
}SLNode;

//(1)初始化
void ListInitiate(SLNode** head)
{
	*head = (SLNode*)malloc(sizeof(SLNode));
	(*head)->next = *head;
}

//(2)求当前数据元素个数
int ListLength(SLNode* head)
{
	SLNode* p = head;			//p指向头节点
	int size = 0;

	while (p->next != head)
	{
		p = p->next;
		size++;
	}
	return size;
}

//(3)插入数据元素
int ListInsert(SLNode* head, int i, DataType x)
{
	SLNode* p, * q;
	int j;
	p = head;
	j = -1;
	while (p->next != head && j < i - 1)
	{
		p = p->next;
		j++;
	}

	if (j != i - 1)
	{
		printf("插入数据元素位置错误!");
		return 0;
	}

	q = (SLNode*)malloc(sizeof(SLNode));	//生成新结点
	q->Data = x;							//新节点数据域赋值

	q->next = p->next;						//步骤一
	p->next = q;							//步骤二
	return 1;
}

//(4)删除数据元素
int ListDelete(SLNode* head, int i, DataType* x)
{
	SLNode* p, * s;
	int j;
	j = -1;
	p = head;
	while (p->next != head && p->next->next != head && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("删除元素参数错误!");
		return 0;
	}

	s = p->next;
	*x = s->Data;
	p->next = p->next->next;
	free(s);
	return 1;
}

//(5)取数据元素
int ListGet(SLNode *head, int i, DataType* x)
{
	SLNode* p;
	int j;
	j = -1;
	p = head;
	while (p->next != head && j < i)
	{
		p = p->next;
		j++;
	}

	if (j != i)
	{
		printf("取元素位置错误!");
		return 0;
	}

	*x = p->Data;
	return 1;

}
//(6)撤销循环单链表
void Destroy(SLNode** head)
{
	SLNode* p, * p1;
	int i,  n = ListLength(*head);
	p = *head;
	for (i = 0; i <= n; i++)
	{
		p1 = p;
		p = p->next;
		free(p1);
	}
	*head = NULL;
}

//(7)插入法建立带头结点的循环单链表
void ListInsert1(SLNode** L, int n)
{
	*L = (SLNode*)malloc(sizeof(SLNode));
	(*L)->next = *L;

	printf("请输入链表元素值:\n");
	for (int i = n; i > 0; --i)
	{
		int x;
		printf("请输入第%d个元素的值:", i);
		SLNode* p;
		p = (SLNode*)malloc(sizeof(SLNode));//生成新结点
		scanf("%d", &x);
		p->Data = x;
		p->next = (*L)->next;
		(*L)->next = p;
	}
}

设计主函数如下:

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"循环单链表.h"

void main()
{
	SLNode* head;
	int i, x;

	ListInitiate(&head);
	for (i = 0; i < 10; i++) 
		ListInsert(head, i, i + 1);
	ListDelete(head, 4, &x);
	for (i = 0; i < ListLength(head); i++)
	{
		ListGet(head, i, &x);
		printf("%d	", x);
	}
	Destroy(&head);					//撤销单链表

	printf("\n");
	ListInsert1(&head, 5);			//使用插入法建立带头结点的循环单链表
	for (i = 0; i < ListLength(head); i++)
	{
		ListGet(head, i, &x);
		printf("%d	", x);
	}
}

代码运行如下:
在这里插入图片描述

码字不易,穷酸学生,各位老板打赏个1分钱支持一下,谢谢老板。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值