2.3——链表

数据结构——链表

链表的存储结构

单链表中,我们在C语言可用结构指针来描述。

/*线性表的单链表存储结构*/
typedef struct node
{
	DataType data;
	struct node *next;
}Node;

链表的初始化

首先定一个链表头指针

Node *list;

初始化函数,创建一个头结点,并把头指针指向头结点,头结点的data中保存链表的长度。

int Init(Node **p)
{
	*p = (Node *)malloc(sizeof(Node));
	if(NULL == *p)
	{
		return 0;
	}

	(*p)->next = NULL;
	(*p)->data = 0;

	return 1;
}

在主函数中调用

if(Init(&list))
{
	printf("init success!\n");
}
else
{
	printf("init failure!\n");
}

链表指定位置插入元素

参数:list(头指针),n(插入的位置),e(要插入的内容)

int Insert(Node *list, int n, DataType e)
{
	Node *p = list;
	int i;
	if(NULL == list || n <= 0 || n > list->data + 1)
	{
		printf("Insert %d failure!\n", e);
		return 0;
	}
	Node *tmp = (Node *)malloc(sizeof(Node));
	tmp->data = e;

	for(i = 1; i < n; i++)
	{
		p = p->next;
	}

	if(p->next == NULL)
	{
		p->next = tmp;
		tmp->next = NULL;
	}
	else
	{
		tmp->next = p->next;
		p->next = tmp;
	}
	
	list->data++;

	return 1;
}

在主函数中调用,在1,2,3位置分别插入1,2,3

	for(i = 0; i < 3; i++)
	{
		if(Insert(list, i + 1, i + 1))
		{
			printf("insert %d success!\n", i + 1);
		}
		else
		{
			printf("insert %d failure!\n", i + 1);
		}
	}

打印链表内容

参数:list(头指针)

void Print(Node *list)
{
	Node *p = list;

	if(NULL == list || NULL == list->next)
	{
		printf("the list is empty!\n");
		return;
	}
	for (p = p->next; p != NULL; p = p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
}

主函数中调用

Print(list);

获取指定位置元素

参数:list(头指针),n(位置),e(接收元素的值)

int Get(Node *list, int n, DataType *e)
{
	int i;
	Node *p = list;

	if(n <= 0 || n > list->data)
	{
		return 0;
	}

	for(i = 0; i < n; i++)
	{
		p = p->next;
	}

	*e = p->data;

	return 1;
}

在主函数中调用

	i = 3;
	if(Get(list, i, &e))
	{
		printf("the %dth elem is %d\n", i, e);
	}
	else
	{
		printf("get %dth elem failure\n", i);
	}

删除指定位置元素

参数:list(头指针),n(位置),e(被删除的元素)

int Delete(Node *list, int n, DataType *e)
{
	int i;
	Node *p = list;
	if(NULL == list || n <= 0 || n > list->data)
	{
		return 0;
	}

	for(i = 1; i < n; i++)
	{
		p = p->next;
	}

	*e = p->next->data;
	p->next = p->next->next;

	list->data--;

	return 1;
}

主函数中调用

i = 3;
if(Delete(list, i, &e))
{
	printf("delete %dth elem %d success!\n", i, e);
}
else
{
	printf("delete %dth elem failure!\n", i);
}

销毁链表

参数:list(头指针的地址)

int Destory(Node **list)
{
	Node *p = *list;
	Node *q;

	while(p)
	{
		q = p->next;
		free(p);
		p = q;
	}

	*list = NULL;

	return 1;
}

主函数中调用

	if(Destory(&list))
	{
		printf("destory list success!\n");
	}
	else
	{
		printf("destory list failure!\n");
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值