数据结构之链表

本文详细探讨了数据结构中的链表,包括链表的基本概念、操作以及在实际编程中的应用。通过示例代码linklist.c和linklist.h,展示了链表的创建、插入、删除等操作,同时在main.c中提供了具体的使用场景,帮助读者更好地理解和掌握链表这一核心数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linklist.c

#include "linklist.h"

int InitLink(Node **h)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	*h = (Node *)malloc(sizeof(Node) * 1);
	if (NULL == *h)
	{
		return FAILURE;
	}

	(*h)->next = NULL;

	return SUCCESS;
}

/*
函数描述:链表的插入操作
函数参数:链表头指针   插入的位置   插入的元素
函数返回值:插入成功返回SUCCESS    插入失败返回FAILURE
*/
int InsertLink(Node *h, int p, int e)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	Node *q = h;
	int k = 1;
	while (k < p && q)      //把指针移动到要插入位置的前一个位置
	{
		q = q->next;
		k++;
	}

	if (k > p || !q)        //位置不合法
	{
		return FAILURE;
	}

	Node *n = (Node *)malloc(sizeof(Node) * 1);
	if (NULL == n)
	{
		return FAILURE;
	}

	n->next = q->next;
	n->data = e;
	q->next = n;

	return SUCCESS;
}

int TraverseLink(Node *h)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	Node *n = h->next;
	while (n)
	{
		printf("%d ", n->data);
		n = n->next;
	}
	printf("\n");

	return SUCCESS;
}

int DelLink(Node *h, int p, int *e)
{
	if(NULL == h)
	{
		return FAILURE;
	}

	Node *q = h;
	int k = 1;
	while (k < p && q)
	{
		k++;
		q = q->next;
	}
	if (k > p || !q || q->next == NULL)
	{
		return FAILURE;
	}

	Node *n = q->next;
	*e = n->data;
	q->next = n->next;
	free(n);

	return SUCCESS;
}

/*
函数描述:获取指定位置的元素
函数参数:链表指针   位置   存放获取的元素
*/
int GetElem(Node *h, int p, int *e)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	Node *n = h;
	int k = 0;
	while (k < p && n)
	{
		n = n->next;
		k++;
	}

	if (p <= 0 || !n)
	{
		return FAILURE;
	}

	*e = n->data;
	return SUCCESS;
}

int LocateElem(Node *h, int num, int *p)
{
	if (NULL == h || NULL == p)
	{
		return FAILURE;
	}

	Node *n = h->next;
	int k = 1;
	while (n)
	{
		if (n->data == num)
		{
			*p = k;
			return SUCCESS;
		}
		k++;
		n = n->next;
	}

	return FAILURE;
}

int ClearLink(Node *h)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	Node *n = h->next;
	while (n)
	{
		h->next = n->next;
		free(n);
		n = h->next;
	}

	return SUCCESS;
}

int DestroyLink(Node **h)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	free(*h);
	*h = NULL;

	return SUCCESS;
}

int ReverseLink(Node *h)
{
	if (NULL == h)
	{
		return FAILURE;
	}

	Node *p = h->next;
	h->next = NULL;

	while (p)
	{
		Node *q = p;
		p = p->next;
		q->next = h->next;
		h->next = q;
	}

	return SUCCESS;
}

linklist.h

#ifndef LINKLIST_H
#define LINKLIST_H

#include <stdio.h>
#include <stdlib.h>

#define SUCCESS      1000
#define FAILURE      1001

struct Node     //表示结点信息
{ 
	int data;
	struct Node *next;
};
typedef struct Node Node;

int InitLink(Node **h);
int InsertLink(Node *h, int p, int e);
int TraverseLink(Node *h);
int DelLink(Node *h, int p, int *e);
int GetElem(Node *h, int p, int *e);
int LocateElem(Node *h, int num, int *p);
int ClearLink(Node *h);
int DestroyLink(Node **h);
int ReverseLink(Node *h);

#endif

main.c

#include "linklist.h"

int main()
{
	Node *head = NULL;      //定义头指针

	int ret = InitLink(&head);   
	if (SUCCESS == ret)
	{
		printf("初始化成功!\n");
	}
	else
	{
		printf("初始化失败!\n");
	}

	int i;
	for (i = 0; i < 10; i++)
	{
		ret = InsertLink(head, i + 1, i);     //尾插法
		//ret = InsertLink(head, 1, i);     //头插法
		if (SUCCESS == ret)
		{
			printf("第%d个位置插入%d成功!\n", i + 1, i);
		}
		else
		{
			printf("第%d个位置插入%d失败!\n", i + 1, i);
		}
	}

	ret = InsertLink(head, 3, 100);
	if (SUCCESS == ret)
	{
		printf("插入成功!\n");
	}
	else
	{
		printf("插入失败!\n");
	}

	TraverseLink(head);

	ReverseLink(head);
	TraverseLink(head);

	int num;
	int p = 12;
	ret = DelLink(head, p, &num);
	if (SUCCESS == ret)
	{
		printf("删除%d成功!\n", num);
	}
	else
	{
		printf("删除失败!\n");
	}

	TraverseLink(head);

	p = 12;
	ret = GetElem(head, p, &num);  
	if (SUCCESS == ret)
	{
		printf("第%d个位置元素是%d\n", p, num);
	}
	else
	{
		printf("获取第%d个元素失败!\n", p);
	}


	num = 5;
	ret = LocateElem(head, num, &p);
	if (SUCCESS == ret)
	{
		printf("元素%d位置是%d\n", num, p);
	}
	else
	{
		printf("元素%d不存在!\n", num);
	}

	ret = ClearLink(head);
	if (SUCCESS == ret)
	{
		printf("清空成功!\n");
	}
	else
	{
		printf("清空失败!\n");
	}

	TraverseLink(head);

	ret = DestroyLink(&head);
	if (SUCCESS == ret)
	{
		printf("销毁成功!\n");
	}
	else
	{
		printf("销毁失败!\n");
	}

	for (i = 0; i < 10; i++)
	{
		ret = InsertLink(head, i + 1, i);     //尾插法
		//ret = InsertLink(head, 1, i);     //头插法
		if (SUCCESS == ret)
		{
			printf("第%d个位置插入%d成功!\n", i + 1, i);
		}
		else
		{
			printf("第%d个位置插入%d失败!\n", i + 1, i);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值