链表基本操作(链表基本操作的流程图)

带头链表:固定一个节点作为头结点,起一个标志位的作用,以后不管链表节点如何改变,此头结点固定不变.

不带头链表:头结点不固定,根据实际需要变换头结点

链表基本操作

//链表基本操作
typedef struct _LINKNODE
{
	int id;//数据域
	struct _LINKNODE* next;//指针域
}link_node;

typedef struct _LINKNODE
{
	int data;
	struct _LINKNODE* next;
}link_node;

link_node* init_linklist()
{
	//创建头结点
	link_node* head = NULL;
	//给头结点分配内存
	head = (link_node*)malloc(sizeof(link_node));
	if (head == NULL)
	{
		return NULL;
	}
	head->data = -1;
	head->next = NULL;

	//保存当前节点
	link_node* p_current = head;
	int data = -1;
	//循环向链表中插入节点
	while (1)
	{
		printf("please input data:\n");
		scanf("%d", &data);
		//如果输入-1,则退出循环
		if (data == -1)
		{
			break;
		}
		//给新节点分配内存
		link_node* newnode = (link_node*)malloc(sizeof(link_node));
		if (newnode == NULL)
		{
			break;
		}
		//给结点赋值
		newnode->data = data;
		newnode->next = NULL;
		//新结点入链表,也就是将节点插入到最后一个结点的下一个位置
		p_current->next = newnode;
		//更新辅助指针p_current
		p_current = newnode;
	}
	return head;
}

遍历链表

void foreach_linklist(link_node* head)
{
	if (head == NULL)
	{
		return;
	}
	//赋值指针变量
	Link_node* p_current = head->next;
	while (p_current != NULL)
	{
		printf("%d", p_current->data);
		p_current = p_current->next;
	}
}
void insert_linklist(link_node* head, int val, int data)
{
	if (head == NULL)
	{
		return;
	}
	//两个辅助指针
	link_node* p_prev = head;
	link_node* p_current = p_prev->next;
	while (p_current != NULL)
	{
		if (p_current->data == val)
		{
			break;
		}
		p_prev = p_current;
		p_current = p_prev->next;
	}
	//如果p_current 为空,说明不存在值为val的节点
	if (p_current == NULL) {
		printf("不存在值为%d的节点!\n", val);
		return;
	}
	//创建新的节点
	link_node* newnode = (link_node*)malloc(siezeof(link_node));
	newnode->data = data;
	newnode->next = NULL;
	//新节点入链表
	newnode->next = p_current;
	p_prev->next = newnode;
}
void remove_linklist(link_node* head, int val)
{
	if (head == NULL)
	{
		return;
	}
	//辅助指针
	link_node* p_prev = head;
	link_node* p_current = p_prev->next;
	//查找值为val的节点
	while (p_current != NULL) {
		if (p_current->data == val)
		{
			break;
		}
		p_prev = p_current;
		p_current = p_prev->next;
	}
	//如果p_current为空,表示没有找到
	if (p_current == NULL) {
		return;
	}
	//删除当前节点,重新建立待删除节点的前驱后继节点关系
	p_prev->next = p_current->next;
	//释放待删除节点的内存
	free(p_current);
}
//销毁链表
void destory_linklist(link_node* head)
{
	if (head == NULL)
	{
		return;
	}
	//赋值指针
	link_node* p_current = head;
	while (p_current != NULL)
	{
		//缓存当前节点下一个节点
		link_node* p_next = p_current->next;
		free(p_current);
		p_current = p_next;
	}
}
原文链接:,转发请注明来源!