【数据结构专题】线性表之顺序表
2017-09-18 16:25
323 查看
最近在准备考研,博客的更新没有没有保障。学习了一点数据结构,但书中多为伪码体现,看了几遍后仍体会不到其精要,私以为实践才是最好的老师,so打算开坑,用C++实现各个专题内容。比较初级,关于其中的一些优化和错误,请dalao积极指正。感谢。
除去一些算法基础知识及C/C++入门知识,首先便是线性表。线性表一般分顺序表和链表。今天主要先来实现下顺序表的初始化、创建、查找、插入、删除。
下列程序笔者在code block运行成功
除去一些算法基础知识及C/C++入门知识,首先便是线性表。线性表一般分顺序表和链表。今天主要先来实现下顺序表的初始化、创建、查找、插入、删除。
下列程序笔者在code block运行成功
#include <cstdio> #include <cstdlib> #define ElementType int #define MAXSIZE 1000 #define ERROR -1 /*线性表-顺序表-结构体定义*/ typedef struct LNode *List; struct LNode { ElementType Data[MAXSIZE]; int Last; /*最后一个位置下标,用来计算顺序表的长度*/ };/*L1,*Ptrl1; 结构体定义方法*/ struct LNode L; List PtrL = &L; /*两种数据访问方式 L.Data[i] || PtrL -> Data[i]*/ /*访问顺序表长度 L。Last + 1 || PtrL -> Last + 1*/ /* 初始化 */ List MakeEmpty(){ List PtrL; /*①先定义一个节点的指针PrrL*/ PtrL = (List)malloc(sizeof(struct LNode)); /*②用函数malloc()来申请一个节点的空间,大小为sizeof(struct LNode)*/ PtrL -> Last = -1; /*再强制转换List型,即struct LNode*型的指针*/ return PtrL; } /* 初始化方式2-使其返回L而非L的地址 */ struct LNode MakeEmpty2(){ struct LNode L; *PtrL = L; /*malloc返回的必须是指针,&L不能放在等号左边*/ PtrL = (List)malloc(sizeof(struct LNode)); /*故给L定义一个指针向量Ptrl指向L*/ L.Last = -1; return L; } /* 查找 */ /* 查找X,并返回其存储位置 */ int Find( List Ptrl, ElementType X ) { int i = 0; while( i <= PtrL->Last && PtrL->Data[i]!= X ) i++; if ( i > Ptrl->Last ) return ERROR; /* 如果没找到,返回错误信息 */ else return i; /* 找到后返回的是存储位置 */ } /* 插入 */ /* 在L的指定位置P前插入一个新元素X,注意P是数组下标,从0开始 */ bool Insert( List &PtrL, ElementType X, int P ){ int i; if ( PtrL->Last == MAXSIZE - 1) { /* 表空间已满,不能插入 */ printf("表满"); return false; } if ( P < 0 || P > PtrL->Last + 1) { /* 检查插入位置的合法性 */ printf("位置不合法"); return false; } for( i = PtrL->Last; i >= P; i--) PtrL->Data[i+1] = PtrL->Data[i]; /* 将位置P及以后的元素顺序向后移动 */ PtrL->Data[P] = X; /* 新元素插入 */ PtrL->Last++; /* Last仍指向最后元素,长度+1 */ return true; } /* 删除 */ /* 从L中删除指定位置P的元素,注意P是数组下标,从0开始 */ bool Delete( List &PtrL, int P ){ int i; if( P < 0 || P > PtrL->Last ) { /* 检查空表及删除位置的合法性 */ printf("位置%d不存在元素", P ); return false; } for( i = P + 1; i <= PtrL->Last; i++ ) PtrL->Data[i-1] = PtrL->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */ PtrL->Last--; /* Last仍指向最后元素,长度-1 */ return true; } int CreatNewList(List &PtrL, int n){/*此处PtrL用引用,否则无法真正输入新表值*/ PtrL = (List)malloc(sizeof(struct LNode)); printf("输入新顺序表表值:"< ab3c /span>); for( int i = 0; i < n; i++){ scanf("%d",&PtrL->Data[i]); PtrL->Last++; } printf("新顺序表表值为:"); for( int i = 0; i < n; i++){ printf("%d",PtrL->Data[i]); } printf("\n"); return 1; } int main() { int n; int X,Y,Z; int P; int findP; MakeEmpty(); printf("输入所要创建顺序表的位数:"); scanf("%d",&n); CreatNewList(PtrL , n); printf("查找功能:输入所要查找的顺序表值:"); scanf("%d",&X); findP = Find( PtrL, X ); printf("查找功能:查找到的值的下标位于第%d位\n",findP); printf("插入功能:输入所要插入的值及下标位置:"); scanf("%d %d",&Y,&P); Insert(PtrL, Y, P); printf("插入功能:新顺序表表值:"); for( int i = 0; i < n + 1; i++){ printf("%d",PtrL->Data[i]); } printf("\n"); printf("删除功能:输入所要删除的下标位置:"); scanf("%d",&Z); Delete( PtrL, Z ); printf("删除功能:新顺序表表值:"); for( int i = 0; i < n ; i++){ printf("%d",PtrL->Data[i]); } return 0; }
相关文章推荐
- 数据结构 线性表之顺序存储
- 《数据结构》实验二:线性表的实验(顺序表)
- 数据结构--线性表(顺序存储)
- 写给初学数据结构的同学之(线性表(顺序表,链表))
- 数据结构专题——线性表之单链表及其Java实现
- php数据结构之顺序链表与链式线性表示例
- 线性表的顺序表示和实现(数据结构)
- 数据结构---线性表的顺序表示和实现
- C/C++ 数据结构---线性顺序存储数据:查询快,增删慢
- 数据结构专题——线性表之双链表及其Java实现
- 数据结构--线性表的顺序表示(1~5)
- 数据结构--线性表之顺序表(C语言)
- 数据结构---线性顺序表操作(c++)
- [SDUT](1130)数据结构上机测试1:顺序表的应用 ---顺序存储(线性表)
- 数据结构之线性表之顺序表和链表(通过数据结构角度深入理解arrayList和linkedList的特性)
- 数据结构:线性表的顺序存储
- 数据结构-线性表之顺序储存(Java实现)
- 数据结构JAVA实现线性表之顺序表
- 数据结构专题——栈与队列之顺序栈及其Java实现