验证线性表顺序存储结构的算法

文章目录

目录

文章目录

线性表的定义


线性表的定义

线性表(List): 零个或者多个数据元素的有限序列

注意: 序列说明元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有,且只有一个前驱和后继,是有限的,事实上,计算机处理的对象都是有限的

线性表抽象数据结构定义
前面给出了线性表的定义,现在分析一下线性表应该有哪些操作:

首先线性表中的元素类型都是一样的,对表进行操作那首先得创建表, 没有元素就是空表,然后往里边填数据元素-初始化, 有些数据需要查找,有些不合适需要删除,也可以往里边增加数据。

本文主要介绍了顺序存储结构的算法,希望能对初步学习数据结构算法的你们有所帮助

#include<stdio.h>//线性表的顺序存储结构
#include<stdlib.h>
#include<iostream>
#define LISTINITISIZE 20
#define LISTINCREMENT 5
typedef struct
{
  int *elem;
  int length;
  int Listsize;
}SeqList;
int InitList(SeqList *L)//顺序表的初始化算法,LnitList为函数的返回类型
{
   L->elem=(int *)malloc(sizeof(int)*20);
   if(!(L->elem))
      return 0;
   L->length=0;
   L->Listsize=20;
   return 1;
}
int InsertEIem(SeqList *L,int i,int e)//顺序表的插入算法(插入表的值会发生变化)
{
   int j,newsize;
   int *newbase;
   if(i<1||i>L->length+1)
	   return 0;
   if(L->length>=L->Listsize)
   {
	   newsize=(L->Listsize+5)*sizeof(int);
	   newbase=(int *)realloc(L->elem,newsize);
	   if(!(newbase))
		   return 0;
	   L->elem=newbase;
	   L->Listsize+=5;
   }
   for(j=L->length-1;j>i-1;j++)
	   L->elem[j+1]=L->elem[j];
   L->elem[i-1]=e;
   L->length++;
   return 1;
}
void PrintList(SeqList L)//打印顺序表信息操作(只传值)
{
   int i;
   printf("表的存储空间大小:%d.\n",L.Listsize);
   printf("表中共有元素%d个,各个元素是:\n",L.length);
   for(i=0;i<=L.length-1;i++)
   {
     printf("%d\t",L.elem[i]);
   }
   printf("\n");
}
int DeleteElem(SeqList *L,int i,int *e)//顺序表的删除算法,e表示元素名称,*e将删除的元素代入主程序,值传递单向,址传递双向
{
   int j;
   if((i<=0)||(i>L->length))//移动了n-i个元素
	   return 0;
   *e=L->elem[i-1];
   for(j=i;j<=L->length-1;j++)
   {
      L->elem[j-1]=L->elem[j];
   }
   L->length--;
   return 1;
}
int LocateElem(SeqList L,int e)//顺序表中数据元素的定位算法(不改变元素)
{
   int i;
   for(i=0;i<=L.length-1;i++)
	  if(L.elem[i]==e)
	  {
	    return i+1;
	  }
    return 0;
}
int GetElem(SeqList L,int i,int *e)//顺序表中的取元素操作(抽取指定元素)
{
   if(i<1||i>L.length)
	   return 0;
   *e=L.elem[i-1];//将值带回
   return 1;
}
int PriorElem(SeqList L,int e,int *pre_e)//顺序表中求元素前驱结点操作*pre_e址引用代回来
{
   int i;
   for(i=L.length-1;i>=1;i--)//找到e前面的一个节点
   {
     if(e==L.elem[i])
	 {
	   *pre_e=L.elem[i-1];
	   return 1;
	 }
   }
   return 0;
}
int main ()
{
   int e,pre_e,next_e,j,n,m,h;
   int a[10]={12,22,34,54,3,67,27,35,46,37};
   SeqList L;
   InitList(&L);
   for(j=0;j<10;j++)
   {
     InsertEIem(&L,j+1,a[j]);
   }
   PrintList(L);
   m=DeleteElem(&L,4,&e);
   if (m==0)
      printf("error\n");
	else
	  printf("e=%d\n",e);
    PrintList(L);
    printf("\n");
    printf("enter you find number n:");
    scanf("%d",&n);
	n=LocateElem(L,n);
	if(n==0)
	   printf("not found!\n");
	else
	   printf("The location of the number is %d\n",n);
	printf("enter you collect elememt n:");
	scanf("%d",&n); 
	h=GetElem(L,n,&e);
	if(h==0)
	    printf("not found!\n");
	else
	    printf("you collect element is %d\n",h);
	return 0;        
}

写在最后,希望对与初学者的你有所帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小鱼༒

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值