(数据结构第二章)线性链表的实现
2015-04-10 22:22
260 查看
///链表的实现 ///单链表存储 #include<cstdio> #include<iostream> #include<algorithm> #include<cstdlib> #define ERROR -1 #define OK 1 using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList; void CreateList_L(LinkList &L,int n) { ///逆位序输入n个元素的值,建立带表头结点的单链表线性表 L = (LinkList) malloc (sizeof(LNode)); L ->next = NULL; /// 先建立一个带头节点的单链表 for(int i=n ;i >0; --i){ LinkList p = (LinkList) malloc (sizeof(LNode)); /// 生成新的节点 scanf("%d", &p->data); /// 输入新的节点的值 p ->next = L->next; L->next = p; } } void Printf_L(LinkList L) { ///输出单链表L printf("该单链表值为:"); LinkList p = L->next; while(p) { printf("%d ",p->data); p = p->next; } printf("\n"); printf("\n"); } bool GetElem_L(LinkList L,int i,int &e) { ///L为带头节点的头指针 ///当第i个元素存在时,其赋值给e并返回OK,否则ERROR LinkList p = L->next; int j=1; /// 初始化p指向第一个节点,j计数器 while(p && j <i){ p = p->next; ++j; } if(!p || j>i) return ERROR; e = p->data; return OK; } bool ListInsert_L(LinkList &L, int i, int e) { ///带头节点的单链表L中第i个位置之前插入元素e LinkList p = L; int j=0; while(p && j < i-1) { p = p->next; ++j; } /// 寻找第i-1个节点 if(!p || j>i-1) return ERROR; /// i小于1或者大于表长加1 LinkList s = (LinkList) malloc (sizeof(LNode)); ///生成新的结点 s -> data = e; s -> next = p->next; ///插入L中 p -> next = s; return OK; }//ListInsert_L bool ListDelete_L(LinkList &L, int i,int &e) { ///在带头结点的单链表线性表L中,删除第i个元素,并有e返回其值 LinkList p = L; int j=0; while(p->next && j < i-1){ /// 寻找第i个节点,并令p指向其前驱 p = p->next; ++j; } if(!(p->next) || j > i-1) return ERROR; ///删除位置不合理 LinkList q = p->next; p->next = p->next->next; ///删除并释放节点 e = q->data; free(q); return OK; } int MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) { ///已知单链线性表La和Lb的元素按值非递减排列 ///归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列 LinkList pa = La->next, pb = Lb ->next; LinkList pc = Lc = La; /// 用La的头节点作为Lc的头节点 while(pa && pb){ if(pa -> data <= pb ->data ) { pc ->next = pa; pc = pa; pa = pa->next; } else { pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa ? pa : pb; ///插入剩余段 free(Lb); ///释放Lb的头结点 }///MergeList_L int main() { int n; LinkList L; printf("请输入要输入节点个数:"); scanf("%d",&n); CreateList_L(L,n); Printf_L(L); ///测试GetElem int e,i; printf("输入要找的元素的i:"); scanf("%d",&i); GetElem_L(L,i,e); printf("该元素是%d\n",e); printf("\n"); ///测试ListInsert_L printf("请输入要插入的位置:"); scanf("%d",&i); printf("请输入要要插入的值:"); scanf("%d",&e); ListInsert_L(L,i,e); Printf_L(L); ///测试ListDelete_L printf("请输入要删除的元素的位序:"); scanf("%d",&i); ListDelete_L(L,i,e); Printf_L(L); ///测试MergeList_L LinkList Lb; printf("请输入Lb要输入节点个数:"); scanf("%d",&n); CreateList_L(Lb,n); Printf_L(Lb); LinkList Lc; MergeList_L(L,Lb,Lc); printf("Lc"); Printf_L(Lc); return 0; }
相关文章推荐
- javascript实现数据结构:线性表--线性链表(链式存储结构)
- 数据结构 第二章 线性表 英语成绩表的单链表实现
- 数据结构第二章之线性表C实现
- (数据结构第二章)线性表的实现
- 数据结构 严蔚敏 清华大学出版社 第二章 抽象数据类型 链表的实现 成功编译并运行
- 数据结构 第二章 线性表(4)单链表的实现
- 数据结构编程笔记六:第二章 线性表 双向循环链表的实现
- 数据结构 第二章 线性表 英语成绩表的顺序表实现
- 数据结构 第二章 线性表(1)顺序线性表的实现
- 数据结构编程笔记三:第二章 线性表 顺序表的实现
- 数据结构第五版第二章实验2.实现单链表的各种基本运算
- 第二章 实现复杂的数据结构
- 数据结构编程笔记五:第二章 线性表 静态链表的实现
- 严蔚敏版《数据结构》第二章线性表的算法C语言实现
- (数据结构第二章)静态链表的实现
- 数据结构编程笔记七:第二章 线性表 一元多项式程序的实现
- 4000 《数据结构》(严蔚敏)算法代码实现第二章
- 【C++源代码】文件夹比较、文件比较的数据结构,定义和实现
- php 实现的基本数据结构
- 利用java实现数据结构中常用的插入排序和快速排序算法