链表学习(C语言篇)

链表

数据结构中链表是基础中的基础,接下来,学习一下链表

一、创建链表

//创建链表
typedef struct LinkNode//用结构体来创建
{
     
	int id;//数据域(用来填写数据)
	LinkNode* next;//指针域(用来存放下一个结点的指针)
}link_node;

二、初始化链表

编写函数:link_node* init_linklist()

建立带有头结点的单向链表,循环创建结点,结点数据域中的数值从键盘输入,以 -1 作为输入结束标志,链表的头结点地址由函数值返回.

//初始化链表
link_node* init_linklist() 
{
     
	link_node* head = NULL;//申请一个头节点,制空
	head = (link_node*)malloc(sizeof(link_node));//给头节点申请内存空间
	if (head == NULL)//如果头节点等于空
	{
     
		return NULL;//退出
	}
	//head->id = -1;//头节点,不维护数据域
	head->next = NULL;//头节点指针制空(初始化)

	link_node* p_current = head;//current指向第一个真实数据节点
	int data = 0 ;//创建data

	while (1)//循环
	{
     
		printf("插入数据:\n");
		scanf("%d", &data);//输入一个int型数据
		if (data == -1)//如果输入-1,就退出
		{
     
			break;
		}
		link_node* newnode = (link_node*)malloc(sizeof(link_node));
		//创建一个新的指针newnode 给它申请内存空间
		if (newnode == NULL)//如果这个指针没有地址,退出循环
		{
     
			break;
		}

		newnode->id = data;//给newnode 记录数据
		newnode->next = NULL;//给newnode记录地址

		p_current->next = newnode;//重新赋到p_current上
		p_current = newnode;
	}
	return head;
}

三、遍历链表

编写函数:void foreach_LinkList(LinkNode* head)

//遍历
void foreach_LinkList(LinkNode* head) {
     
	if (head == NULL)//判断头节点为空就返回
	{
     
		return;
	}
	struct LinkNode* current = head->next;//current指向第一个真实数据节点

	while (current != NULL)//循环打印,直到尾结点为空
	{
     
		printf("%d\n", current->id);//打印当前节点数据
		current = current->next;//指向下一个节点
	}
}

四、插入链表

编写函数: void insert_LinkList( LinkNode* head, int oldVal,int newVal).

//插入
void insert_LinkList(LinkNode* head, int oldVal,int newVal)
{
     
	if (head == NULL)//判断头节点为空就返回
	{
     
		return;
	}
	//创建两个辅助指针
	LinkNode* current = head->next;
	LinkNode* prev = head;
	while (current != NULL)
	{
     
		if (current->id == oldVal)//值跟原来一样就退出循环
		{
     
			break;
		}
		//移动两个赋值的指针
		prev = current;
		current = current->next;
	}
	//创新的节点
	LinkNode* newNode = (link_node*)malloc(sizeof(LinkNode));
	newNode->id = newVal;
	newNode->next = NULL;
	//更新指针的指向
	newNode->next = current;
	prev->next = newNode;
}

五、删除链表

编写函数: void remove_LinkList(LinkNode* head, int val)

//删除
void remove_LinkList(LinkNode* head, int val)
{
     
	if (head == NULL)//判断头节点为空就返回
	{
     
		return;
	}
	//创建辅助指针
	LinkNode* prev = head;
	LinkNode* current = prev->next;
	//查找值为val的节点
	while (current != NULL)
	{
     
		if (current->id = val)
		{
     
			break;
		}
		prev = current;
		current = prev->next;
	}
	//如果current为空表示没找到,退出
	if (current = NULL)
	{
     
		return;
	}
	prev->next = current->next;//删除当前节点,并重新建立当前节点current的前驱后继节点关系
	free(current);//释放掉内存
}

六、销毁链表

编写函数: void destroy_linklist(link_node* head)

//销毁
void destroy_LinlList(LinkNode* head)
{
     
	if (head == NULL)//判断头节点为空就返回
	{
     
		return;
	}
	LinkNode* current = head;//创建辅助指针
	while (current != NULL)//持续循环直到指针为空
	{
     
		LinkNode* p_next = current->next;//缓存当前节点寻找下一个节点
		free(current);//释放内存
		current = p_next;//替换继续下一个
	}
}

七、动态链表/静态链表

静态链表

//静态链表
void StaticList()
{
     
	//创建节点
	struct LinkNode node1 = {
      10,NULL };
	struct LinkNode node2 = {
      20,NULL };
	struct LinkNode node3 = {
      30,NULL };
	struct LinkNode node4 = {
      40,NULL };
	struct LinkNode node5 = {
      50,NULL };
	//建立节点之间的联系
	node1.next = &node2;
	node2.next = &node3;
	node3.next = &node4;
	node4.next = &node5;
	//遍历
	struct LinkNode* pCurrent = &node1;
	while (pCurrent != NULL)
	{
     
		printf("%d\n", pCurrent->id);
		pCurrent = pCurrent->next;
	}
}

动态链表

//动态链表
void DynamicList()
{
     
	//申请动态内存空间并建立节点
	struct LinkNode* node1 = (LinkNode*)malloc(sizeof(struct LinkNode));
	node1->id = 10;
	struct LinkNode* node2 = (LinkNode*)malloc(sizeof(struct LinkNode));
	node2->id = 20;
	struct LinkNode* node3 = (LinkNode*)malloc(sizeof(struct LinkNode));
	node3->id = 30;
	struct LinkNode* node4 = (LinkNode*)malloc(sizeof(struct LinkNode));
	node4->id = 40;
	//建立节点关系
	node1->next = node2;
	node2->next = node3;
	node3->next = node4;
	node4->next = NULL;
	//遍历
	struct LinkNode* pCurrent = &node1;
	while (pCurrent != NULL)
	{
     
		printf("%d\n", pCurrent->id);
		pCurrent = pCurrent->next;
	}
	//释放
	free(node1);
	free(node2);
	free(node3);
	free(node4);
}

你可能感兴趣的:(考研,C语言,链表,数据结构)