单向链表的基本应用-增删改查

一、单向链表功能函数初始化

/*********************************************/
/*demon:单向链表       author:乐乐           */
/********************************************/
typedef char data_t;
//1.定义单向链表结构体
typedef struct node_t
{
	data_t  data;
	struct node_t *next;
}linknode_t,*linklist_t;
//2.创建链表
linklist_t Creat_link(void)
{
	linklist_t football_list;
	football_list = (linklist_t)malloc(sizeof(linknode_t));//切记申请空间
	if(NULL == list)
	{
		printf("malloc error\n");
		return NULL;
	}
	football_list->next  = NULL;
	return football_list;
}

二、插入数据

//3.尾插
int InsertLink_End(linklist_t end, data_t data)
{
	linklist_t new ;
	new = (linklist_t) malloc(sizeof(linknode_t));
	if(NULL == new)
	{
		printf("InsertLinkEnd: malloc error\n");
		return 0;
	}
	while(end->next != NULL)
	{
		end = end->next;//循环到尾部节点
	}
	new->data = data;
	new->next = NULL;
	end->next = new;//使尾节点指向要插入的节点
	return 1;
}
//4.获得链表中第pox节点首地址
//pox:要获取的节点位置
linklist_t GetLink(linklist_t list, int pos)
{
	linklist_t p = list;
	int i;
	for(i = 0; i < pos; i++)
	{
		if(p == NULL)
			return NULL;
		p = p->next;
	}
	return p;
}
//5.在指定pox位置插入新节点
//思想:找到要插入位置的前一个节点,使前一个节点的next指向插入的新节点,新节点的next指向要插入位置的节点数据
int InsertLink_Any(linklist_t list,int pos, data_t data)
{
	linklist_t before = list;
	linklist_t new;
	before = GetLink(list, pos-1); // 找插入位置前一个节点
	if(NULL == before)
		return -1;
	new = (linklist_t)malloc(sizeof(linknode_t));
	if(NULL == new)
	{
		printf("InsertLinkAny malloc error\n");
		return 0;
	}
	new->data = data;
	new->next = before->next; // 插入数据的next指向该位置之前的next指向的节点
	before->next = new;//插入位置之前的next指向要插入的节点new
	return 1;
}
//6.删除链表中指定位置节点
int DeleteLink_Any(linklist_t list, int pos)
{
	linklist_t before, p;
	before = GetLink(list, pos-1);
	if(before != NULL && before->next != NULL)//确保删除的不是头尾
	{
		p = before->next;

		before->next = p->next; // 删除操作
		free(p);//释放要删除的节点
		return 1;
	}
	else
	{
		return 0;
	}
}
//7.修改指定位置的数据
int UpdateLink(linklist_t list, int pos,data_t value)
{
	linklist_t p = GetLink(list, pos);//获得链表中第pox节点首地址
	if(NULL == p)//确保修改的原数据不为空
			return 0;
	p->data = value;
	return 1;
}
//8.链表的长度
int Get_Len(linklist_t list)
{
	linklist_t p = list->next;
	int len = 0;
	while(p != NULL)
	{
		p = p->next;
		len++;
	}
	return len;
}
//9.释放链表所有节点空间
void Free_Link(linklist_t list)
{
	linklist_t p = list->next;//p指向次节点
	while(p != NULL)
	{
		list->next = p->next;
		free(p);//释放p指向的节点
		p = list->next;
	}
	free(list);//释放头节点
}
//10.遍历链表
void ShowLink(linklist_t list)
{
	linklist_t p = list->next;
	while(p != NULL)
	{
		printf("%c -- ", p->data);
		p = p->next;  // p指向下一个节点
	}
	printf("\n");
}
int main()
{
	linklist_t list = CreateLink();//创建链表
	InsertLink_End(list, 'A');//第一个元素是A
	InsertLink_End(list, 'B');//第二个元素是B
	InsertLink_End(list, 'C');//第三个元素是C
	ShowLink(list);//打印A-B-C
	InsertLink_Any(list, 2, 'D');//在第二个位置插入D
	ShowLink(list);//打印A-D-B-C
	printf("link len = %d\n",GetLen(list));//打印表长
	DeleteLink_Any(list, 2);//删除第二个位置数据
	ShowLink(list);//打印A-B-C
	UpdateLink(list, 3, 'E');//将第三个位置的C替换为E
	ShowLink(list);//打印A-B-E
	FreeLink(list);//释放链表,使用完一定要释放,避免内存泄漏
	return 0;
}

运行结果
在这里插入图片描述

你可能感兴趣的:(数据结构)