C+数据结构与算法之顺序表

燕返 2019-06-30

1.定义

线性表的顺序存储称为顺序表。元素间逻辑关系相邻,内存地址相邻;支持随机访问,可以通过下标访问表中每一个元素。
C+数据结构与算法之顺序表


2.结构定义

#define MaxSize 50
typedef struct {
int data[MaxSize];
int length;
}Sqlist;

3.相关算法

1)顺序表创建

void creat(Sqlist &L)
{
int a;
printf("线性表元素总数:\n");
scanf("%d",&a);
printf("依次输入每个元素\n");
for(int i=0;i<a;i++)
{
scanf("%d",&L.data[i]);
L.length++;
}
}

2)指定位置插入元素

int insert(Sqlist &L,int i , int e){//在某个位置插入一个元素(成功返回1,失败返回0)
if(i<1||i>L.length+1)//如果插入位置小于1或者大于表长+1,则位置不合法
return 0;
else if(i>=MaxSize)//如果位置大于等于最大表长,则不可插入
return 0;
else if (i== L.length+1)
{
L.data[L.length] = e;
L.length ++;
return 1;
}
else {
for(int j = L.length;j>=i;j--)//将插入位置后的所有元素后移
{
    L.data[j]=L.data[j-1];//这里需注意,数组下标是从0开始的
    L.data[i-1] = e;
}
    L.length++;//表长+1
    return 1;
}
}

C+数据结构与算法之顺序表


3)删除指定位置元素

int listdelete(Sqlist &L, int i , int &e){//成功返回1失败返回0
if(i<1||i>L.length)//如果删除位置小于1或者大于表长,则位置不合法
return 0;
e = L.data[i-1];
for(int j = i; j<L.length; j++)//删除位之后所有元素前移
   L.data[j-1] = L.data[j];
L.length--;//表长-1
return 1;
}

4)按值查找

int find(Sqlist L,int e){
int i;
for (i = 0; i < L.length; i++)
{
   if(e==L.data[i])
   {
     return i+1;
   }
   else 
   {
      return 0;
   }
}
}

4.完整代码

#include <stdio.h>
#include <stdlib.h>
//顺序表定义
#define MaxSize 50
typedef struct {
int data[MaxSize];
int length;
}Sqlist;
//先声明函数
void creat(Sqlist &L);//建立线性表
void show(Sqlist L);//显示线性表

//在指定位置插入数据
int insert(Sqlist &L,int i , int e){//在某个位置插入一个元素(成功返回1,失败返回0)
if(i<1||i>L.length+1)//如果插入位置小于1或者大于表长+1,则位置不合法
return 0;
else if(i>=MaxSize)//如果位置大于等于最大表长,则不可插入
return 0;
else if (i== L.length+1)
{
L.data[L.length] = e;
L.length ++;
return 1;
}
else {
for(int j = L.length;j>=i;j--)//将插入位置后的所有元素后移
{
    L.data[j]=L.data[j-1];//这里需注意,数组下标是从0开始的
    L.data[i-1] = e;
}
    L.length++;//表长+1
    return 1;
}
}

//删除指定位置元素
int listdelete(Sqlist &L, int i , int &e){//成功返回1失败返回0
if(i<1||i>L.length)//如果删除位置小于1或者大于表长,则位置不合法
return 0;
e = L.data[i-1];
for(int j = i; j<L.length; j++)//删除位之后所有元素前移
   L.data[j-1] = L.data[j];
L.length--;//表长-1
return 1;
}


//按值查找成功返回位序,失败返回0
int find(Sqlist L,int e){
int i;
for (i = 0; i < L.length; i++)
{
   if(e==L.data[i])
   {
     return i+1;
   }
   else 
   {
      return 0;
   }
}
}


int main()
{
Sqlist L;
L.length=0;//初始化线性表
creat(L);//创建线性表
/*
printf("在顺序表哪个位置插入元素:\n");
int i,e;
scanf("%d",&i);
printf("插入元素值:\n");
scanf("%d",&e);
int j = insert(L,i,e);
if(j == 1)
{
printf("插入成功\n");
show(L);//打印线性表元素
}
else
{
printf("插入失败\n");
}

printf("删除第几个位置的数\n");
int h,k;
scanf("%d",&h);
int temp = listdelete(L,  h ,  k);
if(temp == 1)
{
printf("成功\n");
show(L);//打印线性表元素
}
else
{
printf("失败\n");
}
*/
//按值查找
int e,temp;
printf("想查找的值:\n");
scanf("%d",&e);
temp = find(L,e);
if (temp == 0)
{
printf("失败\n");
}
else
{
    printf("成功\n");
    printf("该元素位序为%d\n",temp);
}
return 0;
}
//创建
void creat(Sqlist &L)
{
int a;
printf("线性表元素总数:\n");
scanf("%d",&a);
printf("依次输入每个元素\n");
for(int i=0;i<a;i++)
{
scanf("%d",&L.data[i]);
L.length++;
}
}
//打印
void show(Sqlist L)
{
int i;
printf("当前元素:\n");
for(i=0;i<L.length;i++)
printf("%d\t",L.data[i]);
printf("\n");
}

5.小结

顺序表是最基本及简单的一种数据结构,优点明显(随机访问,算法简单)但缺点很突出,不利于内存优化,不利于动态处理,对于一些对内存要求很高的算法以及动态处理很不适用。

相关推荐