数据结构 --- 单循链表操作 (结点的增,删,查,改)

这篇博客详细介绍了如何使用C语言实现单循环链表的操作,包括创建、按位置插入、更新节点信息以及删除节点。通过示例代码展示了如何初始化链表、插入新节点、修改节点数据以及删除指定位置的节点,并提供了遍历链表和获取链表长度的函数。此外,还展示了如何在实际应用中运用这些操作。
摘要由CSDN通过智能技术生成

createLinkList()   //创建并初始化单循环链表

createNode() //创建结点

insertNode(LinkList *list,Elment data) //插入结点

insertByIndex(LinkList *list, int i,Elment data)  //按索引位置插入结点

updateNode(LinkList *list, int i,Elment newData) //修改结点信息

deleteNode(LinkList *list, int i)    //删除结点

getLength(LinkList *list)  //获取链表长度

#include<stdio.h>
#include<stdlib.h>
#define SUCCESS 0
#define ERROR -1

typedef char Elment;

//单链表存储结构
typedef struct Node
{
	Elment data;
	struct Node *next;
}Node;


//尾指针结构体
typedef struct LinkList
{
	struct Node *rear;  //尾指针
	int length;        //单链表的长度
}LinkList;

//创建并初始化单循环链表
LinkList * createLinkList()
{
	Node *head = (Node *)malloc(sizeof(Node));
	head->next = head;
	LinkList *linkList = (LinkList *)malloc(sizeof(LinkList));
	linkList->length = 0;
	linkList->rear = head;
	return linkList;
}

//创建结点
Node * createNode(Elment data)
{
	Node *node = (Node *)malloc(sizeof(Node));
	node->next = NULL;
	node->data = data;
	return node;

}


//插入结点
int insertNode(LinkList *list,Elment data)
{
	Node *newNode = createNode(data);
	Node *p = list->rear;

	newNode->next = p->next;   //
	p->next = newNode;         //切记写反

	list->rear = newNode;     //更新位指针
	list->length++;

	return SUCCESS;
}

//指定位置插入结点
int insertByIndex(LinkList *list, int i,Elment data)
{
	if (i <= 0) return ERROR;

	int k = 1;
	Node *head = list->rear->next;
	Node *p = head->next;
	
	while (i>k && p->next != head)
	{
		p = p->next;
		k++;
	}
	Node *newNode = createNode(data);

	if (p == list->rear)			//判断指针p是否指向尾指针
	{
		list->rear = newNode;      //更新尾指针
	}

	newNode->next = p->next;
	p->next = newNode;
	

	return SUCCESS;
}

//修改结点信息

int updateNode(LinkList *list, int i,Elment newData)
{
	if (i <= 0) return ERROR;

	int k = 1;
	Node *head = list->rear->next;
	Node *p = head->next;

	while (i>k && p->next != head)
	{
		p = p->next;
		k++;
	}

	p->data = newData;

	return SUCCESS;
}

//删除结点
int deleteNode(LinkList *list, int i)
{
	if (i <= 0) return ERROR;

	int k = 1;
	Node *head = list->rear->next;
	Node *p = head->next;

	while (i-1>k && p->next != head)    //删除结点为 a(i)  则p指针指向a(i-1)结点的地址
	{
		p = p->next;
		k++;
	}
	Node *q = p->next;
	p->next = q->next;

	if (q == list->rear) list->rear = p;        //判断是否为尾指针
	free(q);

	return ERROR;
}



//遍历单循环链表
int showLinkList(LinkList *list)
{
	Node *p = list->rear->next->next;  //第一个结点(a1)头结点的下一个
	
	while (p != list->rear->next)
	{
		printf("%c  ", p->data);
		p = p->next;
	}
	putchar('\n');
	return SUCCESS;
}

//获取链表长度
int getLength(LinkList *list)
{
	return list->length;
}




int main()
{

	LinkList * list = createLinkList();
	insertNode(list, 'A');
	insertNode(list, 'B');
	insertNode(list, 'C');
	insertNode(list, 'D');
	printf("创建单循环链表并插入ABCD  \n");
	printf("遍历单循链表:");
	showLinkList(list);

	printf("\n在B结点后面插入新结点(b)\n");
	insertByIndex(list, 2,'b');  //在第一个结点后面插入
	printf("遍历单循链表:");
	showLinkList(list);

	printf("\n修改结点数据(D改为E)\n");
	updateNode(list, 5, 'E');
	printf("遍历单循链表:");
	showLinkList(list);

	printf("\n删除结点(E)\n");
	deleteNode(list, 5);         //删除结点
	printf("遍历单循链表:");
	showLinkList(list);

	printf("\n链表的长度为: %d\n", getLength(list));



	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值