您的位置:首页 > 编程语言 > C语言/C++

【C解析之九】链表初探

2014-03-22 19:29 246 查看


C解析之九链表初探

前言:链表可以更好的适应实时变化的存储需求,具有无限的扩展性,然而你并不需要担心是否有足够连续的内存。

1.链表的优势:

连续内存约束:数组的内存必须是连续的,当存储数据量达到一定程度,开辟数组空间可能面临一个严重的问题-内存中找不到足够大的连续内存。链表不需要连续的内存,它可以将零散的内存串起来,不断的延伸表的长度。
插入与删除:数组的插入与删除需要移动大量的数据,并且在时间的消耗上具有不定性,在数据实时变化的情况下,数组的效率非常低下。链表的删除与插入只需操作几个指针,具有固定的时间消耗,相当高的效率。
更好的适用性:即使是动态开辟的数组,如果遇到更大的存储需求,就必须重新开辟更大的数组并复制数据。链表在几乎可以满足任何大小,不断变化的存储需求。

2.链表的构成:
链表由节点,相互链接形成。那么组成链表的结点应该具有哪些特点,首先链表是用来存储数据的,所以结点必须有数据存储区,再者链表需要相互链接,那么显然还有一个指针存储区。




数据存储区:存储数据信息。
指针存储区:存储一个指针,用于指向下一个节点。




不难理解,节点的指针指向下一个节点,下一个又指向下一个...便形成了一个链。显然,链表的节点需要定义成一个结构体,包含数据的部分与指针部分。
3.链表的建立:

第一步:定义节点。
第二不:添加节点形成链表。

下面是链表建立的示例:

#include
#include
//************
//定义链表节点
//************
struct Node{
int id;                //id为学号,Score为成绩
int Score;             //id,Score为数据区
struct Node * next;    //指针next,指向下一个节点,故类型为Node *
};
//************
//定义链表头
//************
Node *Head;

int main(){
Node *temp;
Node *p1;
Head=(Node *)malloc(sizeof(Node));
if(Head!=NULL){          //检查是否申请空间成功
Head->next=NULL;     //只有头节点,故此时指向空NULL
//id,Score均不赋值,一般头节点不用于存储数据
}
printf("现在创建含4带个节点的链表:\n");
for(int i=0;inext=NULL;
printf("请输入id与Score:\n");
scanf("%d %d",&temp->id,&temp->Score);
}
//************
//将节点添加到链表末尾
//************
p1=Head;
while(p1->next!=NULL)
{
p1=p1->next;          //找到链表的末尾
}
p1->next=temp;            //将节添加到链表的末尾

}
printf("现在输出链表中的4个节点:\n");
//************
//输出链表
//************
p1=Head->next;
while(p1!=NULL){
printf("id为%d,成绩为%d\n",p1->id,p1->Score);
p1=p1->next;
}

return 0;
}

读者对上面的示例代码中
//*************************** //***********
//将节点添加到链表末尾 与 //输出链表
//*************************** //***********
这两段代码中的while控制条件,指针相关操作等细节可能不是很明白,难以形成直观的理解。没关系,我们这节先关注链表的整体结构,形成对链表的初步理解,在下一篇文章中,将给你形象直观的解析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息