c语言实现链表

  1. 链表的定义和初始化
typedef struct LinkList
{
	int data;
	struct LinkList* next;
}LinkList;
bool Init(LinkList** L)
{
	*L = (struct LinkList*)malloc(sizeof(LinkList));
	(*L)->next = NULL;
	return true;
}
  1. 判断链表是否为空
bool Empty(LinkList* L)
{
	if (L->next == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}
  1. 链表长度的判定
//check how many elements are in the linked list
int Size(LinkList* L)
{
	int size = 0;
	while (L->next)
	{
		size++;
		L = L->next;
	}
	return size;
}
  1. 在链表指定位置插入元素
//insert element
bool Insert(LinkList* L, int local,int num)
{
	if (local == 1)
	{
		LinkList* K = (struct LinkList*)malloc(sizeof(LinkList));
		K->next = L->next;
		K->data = num;
		L->next = K;
		return true;
	}
	else
	{
		int i=0;
		while (L->next&&i<local-1)
		{
			L = L->next;
			i++;
		}
		if (i <= local - 1)
		{
			LinkList* K = (struct LinkList*)malloc(sizeof(LinkList));
			K->next = L->next;
			L->next = K;
			K->data = num;
			return true;
		}
		else
		{
			return false;
		}
	}

}
  1. 删除链表指定位置的元素
// 删除链表中第i个位置的元素
bool DesertLocal(LinkList* L, int local)
{
	int i = 0;
	LinkList* K;
	while (L->next&&i<local-1)
	{
		L = L->next;
		i++;
	}
	if(i == local-1&&L->next!=NULL)
	{
		K = L->next;
		L->next = K->next;
		free(K);
		return true;
	}
	printf("数据不存在\n");
	return false;
}
  1. 清空链表
bool Clear(LinkList* L)
{
	if (Empty(L))
	{
		return true;
	}
	LinkList* K = L;
	K->next = NULL;
	L = L->next;
	while (L->next)
	{
		K = L;
		L = L->next;
		free(K);
	}
}
  1. 删除链表中所有等于a的元素
void DesertElement(LinkList* L, int a)
{
	if (Empty(L) == true)
	{
		return;
	}
	LinkList* K=L;
	while (L->next)
	{
		K = L->next;
		if ((L->next)->data == a)
		{
			L->next = K->next;
			free(K);
		}
		else
		{
			L = L->next;
		}
	}

}
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <malloc.h>

typedef struct LinkList
{
	int data;
	struct LinkList* next;
}LinkList;
//check how many elements are in the linked list
int Size(LinkList* L)
{
	int size = 0;
	while (L->next)
	{
		size++;
		L = L->next;
	}
	return size;
}
//check if thr linklist is empty
bool Empty(LinkList* L)
{
	if (L->next == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//initialize a linked list
bool Init(LinkList** L)
{
	*L = (struct LinkList*)malloc(sizeof(LinkList));
	(*L)->next = NULL;
	return true;
}
//insert element
bool Insert(LinkList* L, int local,int num)
{
	if (local == 1)
	{
		LinkList* K = (struct LinkList*)malloc(sizeof(LinkList));
		K->next = L->next;
		K->data = num;
		L->next = K;
		return true;
	}
	else
	{
		int i=0;
		while (L->next&&i<local-1)
		{
			L = L->next;
			i++;
		}
		if (i <= local - 1)
		{
			LinkList* K = (struct LinkList*)malloc(sizeof(LinkList));
			K->next = L->next;
			L->next = K;
			K->data = num;
			return true;
		}
		else
		{
			return false;
		}
	}

}
// 删除链表中第i个位置的元素
bool DesertLocal(LinkList* L, int local)
{
	int i = 0;
	LinkList* K;
	while (L->next&&i<local-1)
	{
		L = L->next;
		i++;
	}
	if(i == local-1&&L->next!=NULL)
	{
		K = L->next;
		L->next = K->next;
		free(K);
		return true;
	}
	printf("数据不存在\n");
	return false;
}
void DesertElement(LinkList* L, int a)
{
	if (Empty(L) == true)
	{
		return;
	}
	LinkList* K=L;
	while (L->next)
	{
		K = L->next;
		if ((L->next)->data == a)
		{
			L->next = K->next;
			free(K);
		}
		else
		{
			L = L->next;
		}
	}

}
// print linked list
void Print(LinkList* L)
{
	L = L->next;
	while (L)
	{
		printf("%d ", L->data);
		L = L->next;
	}
}
//clear linklist
bool Clear(LinkList* L)
{
	if (Empty(L))
	{
		return true;
	}
	LinkList* K = L;
	K->next = NULL;
	L = L->next;
	while (L->next)
	{
		K = L;
		L = L->next;
		free(K);
	}
}
void test1(LinkList* L)
{
    Insert(L, 1, 10);
	Insert(L, 2, 2);
	Insert(L, 2, 6);
	Insert(L, 2, 1);
	Insert(L, 2, 4);
	Insert(L, 2, 2);
	Insert(L, 2, 6);
	Insert(L, 2, 3);
	Insert(L, 2, 8);
}
int main()
{
	LinkList* L;
	Init(&L);
	test1(L);
	int x = Size(L);
	printf("%d\n", x);
	DesertElement(L, 6);
	Print(L);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值