看数据结构写代码(3)顺序表的 实现

顺序表比较简单,自己掌握也还算可以。只是 写的过程中 出现了一些错误。

大致 分为 这么几种:1.对 运算符优先级了解不清晰,造成错误。 2. 粗心 3. 对顺序表的有些细节 理解不够清楚。

下面奉上 代码:

#include "stdafx.h"#include <stdlib.h>typedef int ElementType;#define INIT_SIZE100#define ADD_SIZE30enum E_State{E_State_Error = 0,E_State_Ok = 1,};struct sqList{ElementType * base;size_t len;size_t listSize;};E_State initList(sqList &list){list.base = (ElementType *)malloc(INIT_SIZE * sizeof(ElementType));if (list.base == NULL){exit(EXIT_FAILURE);}list.len = 0;list.listSize = INIT_SIZE;return E_State_Ok;}E_State destoryList(sqList & l){free(l.base);l.base = NULL;return E_State_Ok;}E_State clearList(sqList & l){destoryList(l);initList(l);return E_State_Ok;}bool listEmpty(sqList l){return l.len == 0 ? true : false;}size_t listLength(sqList l){return l.len;}E_State getElement(sqList l,int i,ElementType & e){if (i < 1 || i > l.len){return E_State_Error;}e = l.base[i-1];return E_State_Ok;}int locateElem(sqList l,ElementType e,int (*compare)(ElementType e1,ElementType e2)){for (int i = 0; i < l.len; i++){if ((*compare)(l.base[i],e) == 0){return i + 1;}}return 0;}int compare(ElementType e1,ElementType e2){return e1 > e2 ? 1 : e1 < e2 ? -1 : 0;}E_State preElement(sqList l,ElementType e,ElementType & pre){int index = locateElem(l,e,compare);if (index <= 1){return E_State_Error;}pre = l.base[index -1 – 1];return E_State_Ok;}E_State nextElement(sqList l,ElementType e,ElementType & next){int index = locateElem(l,e,compare);if (index == 0 || index >= l.len){return E_State_Error;}next = l.base[index];return E_State_Ok;}E_State listInsert(sqList & l,int index,ElementType e){if (index < 1 || index > l.len + 1)//一开始写的 index > l.len 忽略了可以在最后插入的情况{return E_State_Error;}if (l.len >= l.listSize){ElementType * newBase = (ElementType *)realloc(l.base,(l.listSize + ADD_SIZE) * sizeof(ElementType));if (newBase == NULL){exit(EXIT_FAILURE);}l.base = newBase;l.listSize += ADD_SIZE;}ElementType * pEnd = l.base + l.len;ElementType * pInsert = l.base + index – 1;for (; pEnd > pInsert;pEnd –){//error *pEnd = *–pEnd 备注:把优先级表背一下吧….*pEnd = *(pEnd -1);}*pInsert = e;l.len++;return E_State_Ok;}E_State listDelete(sqList & l,int index){if (index < 1 || index > l.len){return E_State_Error;}ElementType * pDel = l.base + index – 1;ElementType * pEnd = l.base + l.len -1;for (; pDel < pEnd; pDel++){//*pDel = *++pDel; 赋值运算符优先级最低, 犯错了*pDel = *(pDel+1);}l.len–;return E_State_Ok;}void listTraverse(sqList l){printf("————————-\n");for (int i = 0; i < l.len; i++){printf("%d\n",l.base[i]);}printf("————————-\n");}void listMerge(sqList & list1,sqList list2){for (int i = 1; i <= list2.len; i++){ElementType e;//getElement(list1,i,e);//一开始粗心写的 list1getElement(list2,i,e);//一开始粗心写的 list1if (locateElem(list1,e,compare) == 0)//在list1 里没找到..{//listInsert(list1,list1.len,e);//一开始粗心写的 list1.lenlistInsert(list1,list1.len+1,e);}}}int _tmain(int argc, _TCHAR* argv[]){sqList list1;initList(list1);//插入,删除for (int i = 1; i <= 10; i++){listInsert(list1,i,i);}listInsert(list1,5,99);listDelete(list1,8);listTraverse(list1);//查找前驱,,后继..ElementType pre;preElement(list1,99,pre);ElementType next;nextElement(list1,99,next);printf("—-99 pre = %d \t,—99 next = %d\n",pre,next);//合并sqList list2;initList(list2);//插入 6~15for (int i = 1; i <= 10; i++){listInsert(list2,i,i+5);}listMerge(list1,list2);printf("———-合并后—————");listTraverse(list1);//释放内存destoryList(list1);destoryList(list2);return 0;}运行截图:

之后加入了 将 两个 排序后的顺序表,合并成 一个 顺序表的 代码:

//快速排序void qsort_My(ElementType * base ,int left,int right){if (left > right){return;}ElementType match = base[left];int i = left;int j = right;while (i != j){while (j > i && base[j] >= match){j –;}while (j > i && base[i] <= match){i ++;}if (j > i){ElementType temp = base[j];base[j] = base[i];base[i] = temp;}}base[left] = base[i];base[i] = match;qsort_My(base,left,i-1);qsort_My(base,i+1,right);}//排序合并void listSortMerge(sqList list1,sqList list2,sqList & listMerge){qsort_My(list1.base,0,list1.len-1);qsort_My(list2.base,0,list2.len-1);ElementType * start1 = list1.base;ElementType * start2 = list2.base;ElementType * end1 = list1.base + list1.len – 1;ElementType * end2 = list2.base + list2.len – 1;size_t listSize = (list1.len + list2.len);listMerge.base = (ElementType *)malloc(listSize * sizeof(ElementType));listMerge.len = 0;listMerge.listSize = listSize;while (start1 <= end1 && start2 <= end2){if (*start1 <= * start2){listMerge.base[listMerge.len++] = *start1++;}else if(*start1 > * start2){listMerge.base[listMerge.len++] = * start2++;}//else{//listMerge.base[listMerge.len++] = * start1++;//}}}

怕仍是不能。于是他们比任何人都看的清楚,又比任何人都看的不确切。

看数据结构写代码(3)顺序表的 实现

相关文章:

你感兴趣的文章:

标签云: