嵌入式 线性表(顺序表,链表)示例
2013-12-02 14:58
267 查看
除第一个元素外,其他每一个元素有一个且仅有一个直接前驱;
除最后一个元素外其他每一个元素有一个且仅有一个直接后继。
这就是线性表的基本特征了。
那顺序表和链表有是什么呢?
顺序表和链表都是线性表。
首先说下顺序表:其实很简单,就是像数组一样,数据存放在连续的存储空间中。
用数组就能很方便的实现这种结构。
所以,因为储存结构的顺序与逻辑结构的顺序完全一致,其最大优点就是可以方便地随机存取表中任一个结点。
就像数组可以直接用下表来对数组进行操作。
但是,这一个又有一个很大的缺点:既然储存结构的顺序与逻辑结构的顺序完全一致,那么,当我们想在中间插入或者在中间删除一个数据的时候,我们就要将该位置以后的所有数据都向后移,或者向前移。效率就有点低了吧。还有一个问题:当我们定义一个数组的什么时候,比如:intstr
;N是一个给定的数,也就是说,我要给他分配一块固定的空间,那么,当我们不知道要多少空间的时候,我们有可能会让费空间,或者空间不够用。
这样就要说到链表了,它是线性表的链接存储表示可不连续地分布在内存中任何的位置。
链表(单链表,双链表,(循环,带头))
我这篇博客就说说单链表了~~~~~
1.单链表结点:
[csharp]
viewplaincopyprint?
<spanstyle="font-size:18px;">typedefintNodeData;
typedef structnode
{
NodeData data;
struct
node*next;
}NODE;</span>
本来不打算说的,后来想想,还是写上去,只想推荐使用typedef
2.单链表的create,insert,remove,sort都不说了
3.我只想说下单链表的转置(很多公司面试题都会问这个):
[csharp]
viewplaincopyprint?
<spanstyle="font-size:18px;">NODE * myreverse(NODE*head)
{
if(head == NULL||head->next == NULL)
{
returnhead;
}
else
{
NODE *front = NULL;
NODE *q = head;
while(q !=NULL)
{
NODE *ne = NULL;
ne = q->next;
q->next = front;
front = q;
q = ne;
}
returnfront;
}
}</span>
这个应该还是很重要的,能完全熟练掌控最好,不能的话就背下来呗,反正也不长。
最后,还是 多画画图,对学数据结构太有用了。
除最后一个元素外其他每一个元素有一个且仅有一个直接后继。
这就是线性表的基本特征了。
那顺序表和链表有是什么呢?
顺序表和链表都是线性表。
首先说下顺序表:其实很简单,就是像数组一样,数据存放在连续的存储空间中。
用数组就能很方便的实现这种结构。
所以,因为储存结构的顺序与逻辑结构的顺序完全一致,其最大优点就是可以方便地随机存取表中任一个结点。
就像数组可以直接用下表来对数组进行操作。
但是,这一个又有一个很大的缺点:既然储存结构的顺序与逻辑结构的顺序完全一致,那么,当我们想在中间插入或者在中间删除一个数据的时候,我们就要将该位置以后的所有数据都向后移,或者向前移。效率就有点低了吧。还有一个问题:当我们定义一个数组的什么时候,比如:intstr
;N是一个给定的数,也就是说,我要给他分配一块固定的空间,那么,当我们不知道要多少空间的时候,我们有可能会让费空间,或者空间不够用。
这样就要说到链表了,它是线性表的链接存储表示可不连续地分布在内存中任何的位置。
链表(单链表,双链表,(循环,带头))
我这篇博客就说说单链表了~~~~~
1.单链表结点:
[csharp]
viewplaincopyprint?
<spanstyle="font-size:18px;">typedefintNodeData;
typedef structnode
{
NodeData data;
struct
node*next;
}NODE;</span>
typedef int NodeData; typedef struct node { NodeData data; struct node *next; }NODE;
本来不打算说的,后来想想,还是写上去,只想推荐使用typedef
2.单链表的create,insert,remove,sort都不说了
3.我只想说下单链表的转置(很多公司面试题都会问这个):
[csharp]
viewplaincopyprint?
<spanstyle="font-size:18px;">NODE * myreverse(NODE*head)
{
if(head == NULL||head->next == NULL)
{
returnhead;
}
else
{
NODE *front = NULL;
NODE *q = head;
while(q !=NULL)
{
NODE *ne = NULL;
ne = q->next;
q->next = front;
front = q;
q = ne;
}
returnfront;
}
}</span>
NODE * myreverse(NODE *head) { if(head == NULL ||head->next == NULL) { return head; } else { NODE *front = NULL; NODE *q = head; while(q != NULL) { NODE *ne = NULL; ne = q->next; q->next = front; front = q; q = ne; } return front; } }
这个应该还是很重要的,能完全熟练掌控最好,不能的话就背下来呗,反正也不长。
最后,还是 多画画图,对学数据结构太有用了。
相关文章推荐
- 嵌入式 select用于实现I/O多路复用示例
- 嵌入式 一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
- 嵌入式 makefile编译静态库和动态库(
- 嵌入式 ubuntu12.04下tftp安装、配置、测试
- mysql installer 无法选择install path
- 1010 [HNOI2008]玩具装箱toy
- 30天自制操作系统笔记(九十)
- 嵌入式 ioctl变成了unlocked_ioctl解释
- 嵌入式 linux下的模块加载详解
- 嵌入式 servfox分析
- 嵌入式 C语言测试:想成为嵌入式程序员应知道的0x10个基本问题详解
- 嵌入式 c语言orC++语言经典面试题汇总
- 嵌入式 Linux下判断是否是一个目录还是一个文件的方法
- 嵌入式 strtok分割字符串示例
- 隐藏android bar
- 嵌入式 简单的Linux下tcp连接示例
- 菜鸟日记
- 嵌入式 Linux下使用minicom串口调试开发板
- 嵌入式 双向链表的头尾中插入法以及释放
- ora-02049,解决一例 数据库死锁问题