C语言数据结构之单链表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数据结构之单链表相关的知识,希望对你有一定的参考价值。

    链表由多个节点构成,节点之间可以灵活的插入、删除。链表以结构体的自引用原理,可以在内存中以不连续的方式动态分配内存来存储数据,这样的结构体就是链表的一个节点。 一个节点分为两个域:一个是数据域,一个是指针域,这方便链表在存储数据的同时可以方便地找到下一个节点。

    相比于数组:数组定义相对简单些,是以连续的内存存储数据,在定义时就确定了长度,这样相比于链表的动态存储,数组就存在有可能数据不够长或内存浪费的缺点。

    对于单链表,在此从建立链表开始,实现链表的增添、删除和输出链表内容。由于链表是动态存储,节点的内存是基于malloc函数动态分配的,所以删除节点时或销毁链表时一定记得手动释放内存,避免内存泄露。

例:

#include <stdio.h>
#include <stdlib.h>
//定义节点类型
typedef struct Node
{
	int data;
	struct Node* next;
}Node;
//创建链表
Node* createlb()
{
	Node* head=(Node*)malloc(1*sizeof(Node));
	head->next=NULL;
	return head;

}
//添加节点(从最后添加)
void add_node(Node* head,int _data)
{
	Node* curr=head;
	Node* newnode=(Node*)malloc(1*sizeof(Node));
	newnode->next=NULL;
	newnode->data=_data;
	while(curr->next!=NULL)
	{
		curr=curr->next;
	}
	curr->next=newnode;
}
//输出链表内容
void printlb(Node* head)
{
	Node* curr=head->next;
	while(curr!=NULL)
	{
		printf("%d\n",curr->data);
		curr=curr->next;
	}
}
//删除节点
void delete_node(Node* head,int old_data)
{
	Node* curr=head->next;
	Node* temp1=head;
	Node* temp2=NULL;
	while(curr!=NULL)
	{
		if(curr->data==old_data)
		{
			temp1->next=curr->next;
			temp2=curr;
			free(temp2);
			temp2=NULL;
		}
		else
		{
			temp1=temp1->next;
		}
		curr=curr->next;
	}
}
//释放节点
void freelb(Node* head)
{
	Node* curr=head->next;
	Node* temp=head;
	while(curr!=NULL)
	{
		curr=curr->next;
		free(temp);
		temp=NULL;
		temp=curr;
	}
	head=NULL;
}
int main(int argc, char const *argv[])
{
	Node* head=createlb();
	int i;
	for(i=0;i<10;i++)
	{
		add_node(head,i+1);
	}
	add_node(head,3);
	add_node(head,3);
	printlb(head);

	printf("\n");
	delete_node(head,3);
	delete_node(head,1);
	printlb(head);
	freelb(head);
	return 0;
}

本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1745671

以上是关于C语言数据结构之单链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构算法C语言实现---2.3线性表的链式表示和实现之单链表

数据结构代码(用C语言) 单链表的插入和删除

C语言 单链表

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

C语言之单链表的使用