顺序表的两次实现

顺序表:内存中的一块连续区域,紧密排列了若干个相同类型的数据。

故,必须事先知道元素有多少个,不然就无法开出合适的内存区域。

对于线性表的"."and"->"

在c语言中,->是指针操作符,.是结构操作符,如果L是一个结构实例的指针,用->,如果是一个结构的实例,用.

L为线性表时,调用*L表示线性表的第一个元素,而调用&L表示线性表的首地址

类型名称:线性表(List)

数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, ...,an ) 线性表基本操作主要有:

1、List MakeEmpty():初始化一个空线性表L;

2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;

3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;

4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;

5、void Delete( int  i, List L ):删除指定位序i的元素;

6、int Length( List L ):返回线性表L的长度n。


```

#include<malloc.h>

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode *List;

typedef int ElementType;

typedef 100 MAXSIZE;

struct LNode{

    ElementType Data[MAXSIZE];

    int Last;

};

struct LNode L; //L.Data[i]

List PtrL; //PtrL->Data[i]

/*

**函数名: List MakeEmpty();

**作  用: 初始化一个空线性表L;

**形  参: 无;

**返回值: PtrL;

*/

List MakeEmpty(void) //初始化空间

{

    List PtrL;

    PtrL=(List)malloc(sizeof(struct LNode));//void *表示未确定类型的指针。可强转为任何其他类型的的指针。

    PtrL->Last=-1;

    return PtrL;

}

/*

**函数名: int Find(ElementType K,List PtrL);

**作  用: 在线性表L中查找X的第一次出现位置

**形  参: int K, List PtrL;

**返回值: 位置i;

*/

int Find(ElementType K,List PtrL) //查找

{

    int i=0

    while(i<=PtrL->Last && PtrL->Data[i]!=K);

    i++;

    if(i>PtrL->Last) return -1

    else return i;

}

/*

**函数名:ElementType FindKth( int K, List L );

**作  用: 根据位序K,返回相应元素;

**形  参: int K,List PtrL;

**返回值: PtrL->Data[K]

*/

ElementType FindKth( int K, List PtrL)

{

    while(K<=PtrL->Last && K>=0);

        return PtrL->Data[K];

}

/*

**函数名: void Insert(ElementType K,int i,List PtrL);

**作  用: 根据位置i来插入参数K;

**形  参: ElementType K,int i,List Ptrl;

**返回值: PtrL;

*/

void Insert(ElementType K,int i,List Ptrl)   //插入

{

  if(PtrL->Last==MAXSIZE-1){

        printf("线性表满");

        return;

    }

    if(i<1||i>Ptrl->Last+2){

        printf("插入位置不合法");

        return;

    }

    for(j=PtrL->Last;j>i-1;j--){

      PtrL->Data[j+1]=PtrL->Data[j]

    }

    PtrL->Data[i+1]=K;

    PtrL->Last++;

}

/*

**函数名: void Delete( int  i, List PtrL )

**作  用: 删除指定位序i的元素;

**形  参: int  i, List PtrL

**返回值:

*/

void Delete( int  i, List PtrL)

{

    int j;

    if(i>1 || i<=PtrL->Last+1){

        for(j=i;j<=PtrL->Last;j++){

            PtrL->Data[j-1]=PtrL->Data[j];

        }

        PtrL->Last--;

    }else{

        return;

    }


}

/*

**函数名: int Length( List L );

**作  用: 返回线性表L的长度n;

**形  参: List PtrL

**返回值:

*/

int Length(List PtrL){

    //return sizeof(PtrL)/ElementType;

    return PtrL->Last+1;

}

```

<pre>

ss

</pre>

第二种是我刚写的

不多说,直接上code

```

#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define listincreament 10 //存储空间分配增量

typedef struct{

int *elem; //存储空间基址 (末尾)

int length;//当前长度

int listsize;// 当前分配的存储容量

} SqList;

//构造一个空的线性表(初始化)

int InitList_Sq(SqList *L)

{

//动态分配空间

L->elem=(int *)malloc(80*sizeof(int));

//存储分配失败

if(!L->elem)

exit(OVERFLOW);

//存储分配成功

//初始化长度为零

L->length=0;

//存储的初始容量为初始分配空间

L->listsize=80;

return OK;

}

//n为要插入的位置

int Input_Sq(SqList *L,int n)

{

int i ,*newbase;

if(n<0)

return ERROR;

if(n>L->listsize)

{

newbase=(int *)malloc(listincreament*sizeof(int));

if(!newbase){

exit(OVERFLOW);

}

L->elem=newbase;

L->length+=listincreament;

}

printf("请输入元素:\n");

for(i=0;i<n;i++)

{

scanf("%d",&L->elem[i]);

L->length++;

}

return OK;

}

//i为位置,并非下标,e为要插入的新元素

int ListInsert_Sq(SqList *L,int i,int e){

//i需要满足1<=i<=ListLength_Sq(L)+1

int *newbase;

int *p;

int *q;//插入的位置

int j;

//判断输入

if(i<1||i>L->length+1)

return ERROR;

//判断线性表是否已满

if(L->length>=L->listsize)//满,(鲁棒性)(扩展)是否动态增加空间?

{

/*newbase=(int *)realloc((L->listsize+listincreament)*sizeof(int));

if(!newbase)

exit(OVERFLOW);//分配失败

*/

for(j=0;j<L->length;j++)

{

newbase[j]=L->elem[j];

}

L->elem=newbase;//新基址

L->length+=listincreament;//增加存储容量

}

q=&(L->elem[i-1]);

for(p=&(L->elem[L->length+1]);p>=q;p--)//元素后移

*(p+1)=*p;

*q=e; //插入

L->length+=1;//表长加1

return L->length;//返回表长

}

int Output_Sq(SqList *L,int i)

{

int j;

printf("更新后的线性表为:\n");

for(j=0;j<i;j++)

printf("%d\t",L->elem[j]);

return OK;

}

//在顺序线性表删除第i个元素,用e返回其值

int Delete_Sq(SqList *L,int i,int e)

{

int *q;

//先检查i的合法性

if(i<1||i>L->length)

return ERROR;

e=L->elem[i-1];//被删除的元素赋给e,之后用作返回

int *p=&L->elem[i-1]; //指针p为被删除元素的位置

for(q=p+1;q<=p+(L->length);q++)

*(q-1)=*q;

L->length-=1;

return OK;

}

int main(void)

{

SqList MyL;

char a,yn;

a='Y';

int k,data,position,*e;

InitList_Sq(&MyL);

printf("请输入元素个数:");

scanf("%d",&k);

Input_Sq(&MyL,k);

Output_Sq(&MyL,k);

while(a=='Y')

{

printf("\n请输入要插入的元素:");

scanf("%d",&data);

printf("\n请输入要插入的位置:");

scanf("%d",&position);

ListInsert_Sq(&MyL,position,data);

//printf(&MyL.length);

Output_Sq(&MyL,k+1);

printf("\n请输入要删除的元素的位置:");

scanf("%d",&position);

Delete_Sq(&MyL,position,e);

Output_Sq(&MyL,k);

printf("\n请问是否继续(Y or N)?:");

getchar();

scanf("%c",&a);

}

system("pause");

return OK;

}

```

效果如下


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容