数据结构之顺序表
2015-10-18 23:37
363 查看
Sequence.h
Sequence.c
严蔚敏的数据结构之顺序表
/* 线性表的动态分配顺序存储结构 */ #define LIST_INIT_SIZE 10 /* 线性表存储空间的初始分配量 */ #define LIST_INCREMENT 2 /* 线性表存储空间的分配增量 */ typedef struct { int *elem; int length; int listsize; }SqList; void InitList(SqList *L); void Destroy(SqList *L); void ClearList(SqList*L); int ListEmpty(SqList L); int ListLength(SqList L); int GetElem(SqList L, int i, int *e);//查找线性表中此元素是否存在; int LocateElem(SqList L, int e, int(*compare)(int, int)); int PriorElem(SqList L, int cur_e, int *Pre_e); int NextElem(SqList L,int cur_e,int *next_e); int ListInsert(SqList *L, int i, int e); int ListDelete(SqList *L, int i, int *e); void ListTraverse(SqList L, void(*vi)(int *));
Sequence.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "Sequence.h" void InitList(SqList *L) { L->elem = malloc(LIST_INIT_SIZE*sizeof(int)); if (!L->elem) { exit(0); } L->length = 0; L->listsize = LIST_INIT_SIZE; } void InputList(SqList *L) { int *p = L->elem; printf("Please input the init dade:\n"); for (int i = 0; i< L->listsize;i++)//这里将L->length 改为LIST_INIT_SIZE { scanf("%d",p++); } } void Destroy(SqList *L) { free(L->elem); L->elem = NULL; L->length = 0; L->listsize = 0; } void ClearList(SqList*L) { L->length = 0; } int ListEmpty(SqList L) { if (L.length == 0) return 1; else return 0; } int ListLength(SqList L) { return L.length; } int GetElem(SqList L, int i, int *e)//查找线性表中此元素是否存在; { if (i<1||i>L.length) { return 0; } *e = *(L.elem + i - 1); return 1; } int LocateElem(SqList L, int e, int(*compare)(int, int))//查找该元素所在的位置; { int *p; int i = 1; p = L.elem; while (i <= L.length&&!compare(*p++, e)) ++i; if (i <= L.length) return i; else return 0; } int PriorElem(SqList L, int cur_e, int *Pre_e) { int i = 2; int *p = L.elem + 1; while (i < L.length&&*p != cur_e) { p++; i++; } if (i > L.length) return 0; else { *Pre_e = *--p; return 1; } } int NextElem(SqList L, int cur_e, int *next_e) { int i = 1; int *p = L.elem; while (i < L.length&&*p != cur_e) { i++; p++; } if (i == L.length) return 0; /* 操作失败 */ else { *next_e = *++p; return 1; } } int ListInsert(SqList *L, int i, int e)//在第i个位置插入数字e; { int * newbase, *q, *p; if (i<1 || i>L->length + 1) return 0; if (L->length>=L->listsize) { newbase = realloc(L->elem, (L->listsize + LIST_INIT_SIZE)*sizeof(int)); if (!newbase) exit(0); L->elem = newbase; L->listsize += LIST_INIT_SIZE; } q = L->elem + i - 1; for (p = L->elem + L->length - 1; p >= q;--p) { *(p + 1) = *p; } *q = e; ++L->length; return 1; } int ListDelete(SqList *L, int i, int *e) { int *p, *q; if (i<1 || i>L->length) /* i值不合法 */ return 0; p = L->elem + i - 1; /* p为被删除元素的位置 */ *e = *p; /* 被删除元素的值赋给e */ q = L->elem + L->length - 1; /* 表尾元素的位置 */ for (++p; p <= q; ++p) /* 被删除元素之后的元素左移 */ *(p - 1) = *p; L->length--; /* 表长减1 */ return 1; } void print(SqList L) { int *p = L.elem; for (int i=0; i <L.listsize;i++) { printf("%d ",*(p++)); } printf("\n"); } void ListTraverse(SqList L, void(*vi)(int *)) { int *p; int i; p = L.elem; for (i = 1; i <= L.length; i++) vi(p++); printf("\n"); } int main() { SqList SqlistTest ;//SqList *SqlistTest; InitList(&SqlistTest);//InitList(SqlistTest);两种传递方式 InputList(&SqlistTest);//由于初始化时里面内容为空所以长度为空但是代码错误,所以可改;错误之处是指针应用错误,对线性表存储数据处理解错误 printf("%d",ListLength(SqlistTest)); printf("%d", ListEmpty(SqlistTest)); printf("销毁数据前\n"); print(SqlistTest); Destroy(&SqlistTest); printf("销毁数据后\n"); print(SqlistTest); //printf("%d", GetElem(SqlistTest,5,1)); system("pause"); return 0; }
严蔚敏的数据结构之顺序表
相关文章推荐
- [题解+总结]20151017数据结构
- 数据结构与算法80道
- 第六周--数据结构之自建算法库之迷宫问题(用队列)
- 数据结构之图
- 第六周--数据结构之自建算法库之迷宫问题(用栈结构)
- 数据结构基本概念
- 中国大学MOOC-陈越、何钦铭-数据结构 列出连通集
- 第六周--数据结构之自建算法库之表达式求值(用栈结构)
- 【ShancoLove】带你看数据结构——第八课:二叉树概念
- 第六周--数据结构之自建算法库之链式队列
- 第六周--数据结构 项目之顺序环形队列
- 第六周--数据结构【线性表(二)链表】项目之链栈
- 数据结构——排序 (二)
- 第六周--数据结构【线性表(二)链表】项目之顺序栈
- 数据结构与算法之栈
- 数据结构导论——自考
- 数据结构总结
- 数据结构实践项目——数组和广义表
- 数据结构——字符串函数的重写
- c++数据结构——模板类重写栈