【数据结构专题】线性表之顺序表

  最近在准备考研,博客的更新没有没有保障。学习了一点数据结构,但书中多为伪码体现,看了几遍后仍体会不到其精要,私以为实践才是最好的老师,so打算开坑,用C++实现各个专题内容。比较初级,关于其中的一些优化和错误,请dalao积极指正。感谢。
  除去一些算法基础知识及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("输入新顺序表表值:");
	    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;
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值