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++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)