赞
踩
链表由多个节点构成,节点之间可以灵活的插入、删除。链表以结构体的自引用原理,可以在内存中以不连续的方式动态分配内存来存储数据,这样的结构体就是链表的一个节点。 一个节点分为两个域:一个是数据域,一个是指针域,这方便链表在存储数据的同时可以方便地找到下一个节点。
相比于数组:数组定义相对简单些,是以连续的内存存储数据,在定义时就确定了长度,这样相比于链表的动态存储,数组就存在有可能数据不够长或内存浪费的缺点。
对于单链表,在此从建立链表开始,实现链表的增添、删除和输出链表内容。由于链表是动态存储,节点的内存是基于malloc函数动态分配的,所以删除节点时或销毁链表时一定记得手动释放内存,避免内存泄露。
例:#include
#include
//定义节点类型
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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。