数据结构(c语言版)顺序表的建立、初始化、插入、删除、遍历等12个基本操作及测试

数据结构 专栏收录该内容
11 篇文章 0 订阅

   数据结构是计算机类学生基本上必修的一门课程,也是比较难得一门课程。对于初学者来说刚开始学肯定会不理解,感觉很难,所以最近写了个数据结构的顺序表。顺序表包含了初始化、判空、求表长、销毁、定位、删除、插入、等十二个基本操作。运行了一下感觉还可以,所以想拿出来和大家分享一下!以下是源代码,建立一个工程

第一个头文件:一些基本的定义声明

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW       -1
#define INFEASIBLE        -1
#define LIST_INIT_SIZE    100  
#define LISTINCREMENT     10  
typedef int Status;
typedef int ElemType;

typedef struct {
ElemType *elem;
int length;
int listsize;
}Sqlist;


第二个头文件:十二个基本函数

#include"header.h"

//1、初始化
Status InitList(Sqlist&L)
{
 L.elem=((ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)));
 if(!L.elem)
  return ERROR;
 L.length=0;
 L.listsize= LIST_INIT_SIZE;
 return OK;
}
 
 //2、销毁
void  Destorylist(Sqlist&L)
{
 if(L.elem)
  free(L.elem);
 L.elem=NULL;


 //3、清空
void ClearList(Sqlist &L)
{
 L.length=0;
}

 //4、判空
Status EmptyList(Sqlist L)
{
 if(L.length==0)
  return TURE;
 else
  return FALSE;
}

 //5、求表长
Status LengthList(Sqlist L)
{
 return L.length;
}

 //6、取元素
Status GetElem(Sqlist L, int i, ElemType &e)
{
 if(i<1||i>L.length)
  return ERROR;
 else
  return e=L.elem[i-1];
}

// 7、定位操作
Status LocateELem(Sqlist L, ElemType e)
{
 int i=0;
 for (i = 0; i < (L.length - 1); i++)
  {
   if(e==L.elem[i])
   return i+1;
  }
}


 //8、求前驱
Status PriorElem(Sqlist L, ElemType pur_e, ElemType pre_e)
{
  int  i;
  ElemType *p,*q;
  p=&L.elem[0];
  for (i = 1; i < L.length - 1; i++)
   {
    if(pur_e==L.elem[i])
     {
      p=&L.elem[i]; 
      break;
    }
  }
  q=p-1;
  pre_e=*q;
  return pre_e;
}


//9、求后继
Status NextElem(Sqlist L, ElemType pur_e, ElemType next_e)
{
 int i;
 ElemType *p,*q;
 p=&L.elem[0];
 for (i = 0; i < L.length - 2; i++)
 {
   if (pur_e == L.elem[i])
   {
    p=&L.elem[i];
   break;
  }
 }
 q=p+1;
 next_e=*q;
 return next_e;
}

 //10、插入
Status InsertElem(Sqlist L, int i, ElemType e)
{
    ElemType *p,*q;
   if(i<1||i>L.length)
    return ERROR;
   if (L.length == L.listsize)
   {
     L.elem=((ElemType*)realloc(L.elem,(LIST_INIT_SIZE+ LISTINCREMENT)*sizeof(ElemType)));
     L.listsize= LIST_INIT_SIZE + LISTINCREMENT;
   }
   q=&L.elem[i-1];
   for (p = &L.elem[L.length - 1]; p > q; p--)
     *(p+1)=*p;
     *(q+1)=e;
   L.length++;
   return e;
}

 //11、删除
Status DeleteElem(Sqlist &L, int i, ElemType e) 
{
   ElemType *p,*q;
   if(!L.elem)
    return ERROR;
   if(i<1||i>L.length)
    return ERROR;
   q=&L.elem[i-1];
   e=*q;
   for (p = &L.elem[i - 1]; p <&L.elem[L.length - 1]; ++p)
     {
  *  p=*(p+1);
     }
    L.length--;
return e;
}

 //12、遍历
void TraverList(Sqlist L) 
{
  int i;
  for (i = 0; i < L.length; i++)
printf("%5d",L.elem[i]);
}

//14、比较
Status CompareList(Sqlist L, ElemType e1, ElemType e2)
{
 if(e1>e2||e2==e2)
 return TURE;
 else
 return FALSE;
}


主函数:对十二个基本操作的测试

#include "stdafx.h"
#include"header1.h"
int main()
{   
    Sqlist L;
    InitList(L);
    int a,b,c,d=0,f,g,i;
    ElemType e=0;
//初始化测试
   printf("初始顺序表的长度%d\n\n", LengthList(L));
    printf("请输入要添加的元素个数:");
   scanf_s("%d",&L.length);
//求表长测试
    printf("\n当前顺序表的长度%d\n",LengthList(L));
    printf("\n请输入线性表元素:");
    for (i = 0; i <L.length; i++)
   scanf_s("%d",&L.elem[i]);
//遍历测试
   printf("\n您输入的元素为:");
  TraverList(L);
  printf("\n");
//定位操作
  printf("请输入你要定位的元素:");
  scanf_s("%d",&g);
  printf("%d的位置为:%d\n",g,LocateELem(L,g));
//求前驱测试
    printf("请输入你想求前驱的元素:");
   scanf_s("%d",&a);printf("\n"); 
   printf("%d的前驱为:%d",a, PriorElem(L,a,d));
//求后继测试
printf("\n请输入你想求后继的元素: ");
scanf_s("%d",&f);printf("\n");
printf("%d的后继为:%d",f,NextElem(L,f,d));
//取元素测试
printf("\n接下来测试取元素\n\n请输入你想取出的元素位序:");
scanf_s("%d",&i);
printf("\n\n");
printf("你取出的元素为:%d",GetElem(L,i,e));
    printf("\n\n");
//删除测试
printf("现在测试删除\n\n请输入删除位置: ");
scanf_s("%d",&b);
printf("\n");
printf("你删除的元素为: %d",DeleteElem(L,b,e));
printf("\n\n");
printf("现在线性表中的元素为:");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
//插入测试
printf("\n现在测试插入\n");
printf("请输入你要插入的位置:");
scanf_s("%d",&c);
printf("\n");
printf("请输入你要插入的元素:");
scanf_s("%d",&e);
printf("\n");
printf("你插入的元素为:%d",InsertElem(L,c-1,e));
printf("\n");
printf("现在顺序表为: ");
for (i = 0; i < L.length + 1; i++)
printf("%5d",L.elem[i]);
    return 0;
}



不懂得可以私信 1936365132@qq.com!

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页

打赏

大叫三声

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值