数据结构(2):线性表的链式表示和实现
2016-03-15 21:28
621 查看
// 线性表的链式表示和实现 #include <iostream> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 // Status是函数返回值类型,其值是函数结果状态代码 typedef int Status; // ElemType是自定义数据类型 typedef int ElemType; // 循环变量 int i,j; using namespace std; // 单链表的存储结构 typedef struct LNode { ElemType data; // 结点的数据域 struct LNode *next; // 结点的指针域 }LNode,*LinkList; // LinkList为指向结构体LNode的指针类型 // 单链表的初始化 Status InitList(LinkList &L) { // 构造一个空的单链表L L = new LNode; // 生成新结点作为头结点,用头指针L指向头结点 L->next = NULL; // 头结点的指针域置空 return OK; } // 单链表的取值 Status GetElem(LinkList L,int i,ElemType &e) { // 在带头结点的单链表L中根据序号i获取元素的值,用e返回L中第i个 // 数据元素的值。 LNode *p; p = L->next; j=1; // 初始化,p指向首元结点,计数器j初值赋为1 while(p && j<i) // 顺链域向后扫描,直到p为空或p指向第i个元素 { p = p->next; // p指向下一个结点 ++j; // 计数器j相应加1 } if(!p || j>i) return ERROR; // i值不合法i>n 或 i<=0 e = p->data; // 取第i个结点的数据域 return OK; } // 单链表的按值查找 LNode *LocateElem(LinkList L,ElemType e) { // 在带头结点的单链表L中查找值为e的元素 LNode *p; p = L->next; // 初始化,p指向首元结点 // 顺链域向后扫描,直到p为空或p所指结点的数据域等于e while(p && p->data!=e) p = p->next; // p指向下一个结点 return p; // 查找成功返回值为e的节点地址p,查找失败p为NULL } // 单链表的插入 Status ListInsert(LinkList &L,int i,ElemType e) { // 在带头结点的单链表L中第i个位置插入值为e的新结点 LNode *p; LNode *s; p=L;j=0; while(p && j<i-1) // 查找第i-1个结点,p指向该结点 { p = p->next; ++j; } if(!p || j>i-1) return ERROR; // i>n+1或者i<1 s = new LNode; // 生成新结点*s s->data = e; // 将结点*s的数据域置为e s->next = p->next; // 将节点*s的指针域指向结点ai p->next = s; // 将节点*p的指针域指向结点*s return OK; } // 单链表的删除 Status ListDelete(LinkList &L,int i) { // 在带头结点的单链表L中,删除第i个元素 LNode *p; LNode *q; p=L;j=0; while(p->next && j<i-1) // 查找第i-1个结点,p指向该结点 { p = p->next; ++j; } if(!p || j>i-1) return ERROR;// 当i>n 或 i<1时,删除位置不合理 q = p->next; // 临时保存被删除结点的地址以备释放 p->next = q->next; // 改变删除结点前驱结点的指针域 delete q; // 释放删除结点的空间 return OK; } // 前插法创建单链表(O(n)) void CreateList_H(LinkList &L,int n) { // 逆位序输入n个元素的值,建立带表头结点的单链表L LNode *p; L = new LNode; L->next = NULL; // 先建立一个带头结点的空链表 for(i=0; i < n; ++i) { p = new LNode; // 生成新结点*p cin>>p->data; // 输入元素值赋给新结点*p的数据域 p->next = L->next; // 将新结点*p插入到头结点之后 L->next = p; } } // 后插法创建单链表(O(n)) void CreateList_R(LinkList &L,int n) { // 正位序输入n个元素的值,建立带表头结点的单链表L LNode *r; LNode *p; L = new LNode; L->next = NULL; // 先建立一个带头结点的空链表 r = L; // 尾指针r指向头结点 for(i=0; i < n; ++i) { p = new LNode; // 生成新结点 cin>>p->data; // 输入元素值赋给新结点*p的数据予以 p->next = NULL; // 将新结点*p插入尾结点*p r->next = p; r = p; } } int main() { /**********************************/ }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)