码迷,mamicode.com
首页 > 编程语言 > 详细

C语言数据结构之单链表

时间:2016-02-28 01:04:40      阅读:186      评论:0      收藏:0      [点我收藏+]

标签: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语言、链表、节点

原文地址:http://10274409.blog.51cto.com/10264409/1745671

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!