4000 《数据结构》(严蔚敏)算法代码实现第二章
2017-03-22 12:30
513 查看
个人学习笔记
说明:代码由C++代码实现,但是和C语言基本一样。力求和课本一样,部分地方已处理,不足之处请指教。#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量 typedef char ElemType; #define OK 1; #define NO 0; #define ERROR 0; #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; typedef struct { ElemType *elem; int length; int listsize; }SqList; bool compare(ElemType c1, ElemType c2) { if(c1 == c2) return 1; else return 0; } bool InitList_Sq(SqList &L)//构造一个空的线性表L { L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L.elem) exit(1);//存储分配失败 L.length = 0;//空表长度为0 L.listsize = LIST_INIT_SIZE;//初始存储容量 return OK; }; bool CreateList(SqList &L)//给一个空线性表赋初值 { cout<<"请输入线性表的初值:"<<endl; cin>>L.elem; //L.elem = "123456"; L.length = strlen(L.elem); L.listsize = L.length; return OK; } bool ListInsert_Sq(SqList &L,int i,ElemType e)//在顺序线性表L中第i个位置之前插入新的元素e,i的合法值为1<=i<=ListLength_Sq(L)+1 { ElemType *newbase, *q, *p; if(i<1 || i>L.length+1) return ERROR; if(L.length >= L.listsize)//当前存储空间已满,增加分配 { newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) exit(1);//存储分配失败 L.elem = newbase;//新基址 L.listsize += LISTINCREMENT;//增加存储容量 } q = &(L.elem[i-1]); for(p=&(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;//插入位置及以后的元素右移 *q = e;//插入e ElemType *t = &(L.elem[L.length]); *++t = '\0'; ++L.length;//表长增1 return OK; } bool ListDelete_Sq(SqList &L, int i, ElemType &e)//在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为1<=i<=ListInsert_Sq(L) { ElemType *p, *q; if((i<1) || (i>L.length)) return ERROR;//i值不合法 p = &(L.elem[i-1]); e = *p;//被删除的元素赋给e q = L.elem+L.length-1;//表尾元素的位置 for(++p; p<=q; ++p) *(p-1) = *p;//被删除元素之后的元素左移 *--p = '\0';//特别注意,此处需要自行清空最后一个值,否则最后一个值就会重复 --L.length;//表长减1 return OK; }//ListDelete_Sq int LocateElem_Sq(SqList L,ElemType e)//在顺序线性表L中查找第1个值与e相同的元素的位序 //若找到,则返回其在L中的位序,否则返回0 { int i = 1;//i的初值为第1个元素的位序 ElemType *p = L.elem;//i的初值为第1个元素的位序 while((i<=L.length) && !(compare(*p++,e))) ++i; if(i<=L.length) return i; else return 0; }//LocateElem_Sq void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)//已知顺序线性表La和Lb的元素按值非递减排列 //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列 { ElemType *pa = La.elem; ElemType *pb = Lb.elem; Lc.listsize = Lc.length = La.length+Lb.length; ElemType* pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType)); if(!Lc.elem) exit(1);//存储分配失败 ElemType* pa_last = La.elem + La.length - 1; ElemType* pb_last = Lb.elem + Lb.length - 1; while(pa<=pa_last && pb<=pb_last)//归并 { if(*pa <= *pb) *pc++ = *pa++; else *pc++ = *pb++; } while(pa<=pa_last) *pc++ = *pa++;//插入La的剩余元素 while(pb<=pb_last) *pc++ = *pb++;//插入Lb的剩余元素 *pc = '\0';//添加以截断 } void outputList(SqList &L)//输出函数 { cout<<L.elem<<endl; } int main() { cout<<"创建一个线性表\n"; SqList La; InitList_Sq(La); CreateList(La); cout<<"after insert"<<endl; ListInsert_Sq(La, 2, '2'); outputList(La); ElemType tmp;//创建一个临时变量 ListDelete_Sq(La, 3, tmp); cout<<"after delete:"<<endl; outputList(La); SqList Lb, Lc; InitList_Sq(Lb); InitList_Sq(Lc); CreateList(Lb); MergeList_Sq(La, Lb, Lc); cout<<"after merge:"; outputList(Lc); int n = LocateElem_Sq(Lc,'7'); cout<<n<<endl; return 0; }
相关文章推荐
- 严蔚敏版《数据结构》第二章线性表的算法C语言实现
- 严蔚敏版数据结构课本代码——链表结构实现算法2.2(BUCT-JK1602-LLP)
- 【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码
- 线索二叉树代码实现 - 数据结构和算法49
- 技术面试宝典: 很全面的算法和数据结构知识(含代码实现)
- 严蔚敏版数据结构学习笔记和代码实现
- 严蔚敏版数据结构课本代码——算法2.1
- 严蔚敏 数据结构 二叉树 代码C语言实现 用C++编译器运行
- 算法导论C语言实现各算法代码集合-第二章
- 几道经典的数据结构算法代码实现(1)
- 算法导论第二章-算法基础-Cpp代码实现
- 严蔚敏版数据结构课本代码——算法2.7
- 【数据结构和算法】【二叉树】二叉树遍历的代码实现
- 平衡二叉树的实现原理(代码实现)- 数据结构和算法78
- 几道经典的数据结构算法代码实现(2)
- 严蔚敏《数据结构》中迷宫算法java实现
- C++类模板 实现队列的链式存储结构算法 《数据结构》(北京科海) 部分代码摘抄,自己编写运行
- 数据结构—中缀表达式转后缀表达式算法及实现—栈的应用—计算表达式(C++代码实现)(1)
- 【数据结构和算法】【栈】顺序栈的代码实现
- 严蔚敏版数据结构课本代码——算法2.2