线性表的存储结构(链式存储结构)
2016-04-01 16:00
288 查看
距上一次写线性表的顺序存储结构已经有一段时间了(详戳http://blog.csdn.net/u010429311/article/details/50933932),这次主要接着来实现线性表的链式存储结构,即我们通常所说的链表。
链表可以用一组任意的存储单元存储线性表的数据元素,而存储数据的这组存储单元可以是连续的,也可以是不连续的。具体看一下图解:
在链表中,我们也可以实现链表的创建、插入、删除等操作。其原理如下图:
以下是具体的实现代码:
定义结构体:
创建链表:
插入元素:
删除元素:
遍历链表:
链表可以用一组任意的存储单元存储线性表的数据元素,而存储数据的这组存储单元可以是连续的,也可以是不连续的。具体看一下图解:
在链表中,我们也可以实现链表的创建、插入、删除等操作。其原理如下图:
以下是具体的实现代码:
定义结构体:
#include <stdio.h> #include <malloc.h> #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; //结点的数据 struct LNode *next; //指向下一结点的指针 } LNode, *LinkList;
创建链表:
/* *逆序往链表里插入n个元素 */ Status createList(LinkList &L, int n) { LinkList p; L = (LinkList) malloc(sizeof(LNode)); //申请结点空间 L->next = NULL; //建立带头结点的链表 for (; n > 0; n--) { p = (LinkList) malloc(sizeof(LNode)); //生成新结点 scanf("%d", &p->data); //输入结点的元素 p->next = L->next; //插入到表头 L->next = p; } return OK; }
插入元素:
/* *往链表的第i个位置插入元素 */ Status listInsert(LinkList &L, int i, ElemType e) { LinkList p, s; p = L; int j = 0; while (p && j < i - 1) { //寻找第i-1个结点 p = p->next; j++; } if (!p || j > i - 1) return ERROR; s = (LinkList) malloc(sizeof(LNode)); //申请新结点 s->data = e; //插入新的结点 s->next = p->next; p->next = s; return OK; }
删除元素:
Status listDelete(LinkList &L, int i, ElemType &e) { LinkList p, q; p = L; int j = 0; while (p->next && j < i - 1) { //寻找第i个结点 p = p->next; j++; } if (!p->next || j > i - 1) return ERROR; q = p->next; //删除结点 p->next = q->next; e = q->data; free(q); //释放被删除结点的空间 return OK; }
遍历链表:
Status loadList(LinkList &L) { if (L->next == NULL) { return ERROR; } LinkList p; p = L->next; //注意,头结点没有存放数值,应从L->next开始遍历 while(p) { //遍历结点,输出数值 printf("%d ", p->data); p = p->next; } printf("\n"); return OK; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- [C/C++]反转链表
- 如何写好 C main 函数
- Tomcat端口被占用解决方法(不用重启)
- “传奇”图象数据存储方式
- C#数据结构之顺序表(SeqList)实例详解
- C#实现基于链表的内存记事本实例
- Lua和C语言的交互详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解