线性表的存储结构和实现

分别附代码和运行结果

                                                               顺序表

实验代码:

#define size 10

#define insize 10

#define TRUE 1

#define FLASE 0

#define OK 1

#define ERROR 0

#include <stdio.h>

#include<stdlib.h>

typedef struct{

    int *elem;

    int length;

    int listsize;

}*Sqlist;

int Initlist_Sq(Sqlist s);//构造一个新的线性表s

int ListInsert_Sq(Sqlist s,int i,int e);//在线性表s的第i个元素之前插入新的元素e

int ListDelete_Sq(Sqlist s,int i,int *e);//删除线性表s的第i个元素并用e返回

int GetElem_Sq(Sqlist s,int i,int *e);//获取线性表s的第i个元素并用e返回

int ListEmpty(Sqlist s);//判断表是否为空表 返回true或者false

int DestroyList_Sq(Sqlist s);//销毁线性表

int ClearList_Sq(Sqlist s);//将线性表重置为空表

int Listlength(Sqlist s);//返回表的长度

int OperateMenu();//建立菜单,提示操作代码

Sqlist scanfs();//向线性表赋值并返回基地址到调用处

void printfs(Sqlist s);//将线性表s中的元素依次打印

void main(){

    Sqlist s=NULL;

    char ch;

    int a,b,c,d,f,g;

    printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");

    scanf("%c",&ch);

   while(ch=='Y'||ch=='y'){

   switch(OperateMenu()){

        case 1:

            s=scanfs();

            if(!ListEmpty(s))printf("创建成功!");break;

        case 2:{

            if(s==NULL){printf("请先建表!");break;}

              printf("请输入插入位置和插入元素:");

                 scanf("%d %d",&a,&b);

                    if(!ListInsert_Sq(s,a,b))printf("插入位置有误!!!\n");

                      else printf("插入成功!");break;

                    }

        case 3:{

            if(s==NULL){printf("请先建表!");break;}

              printf("请输入删除位置:");

                 scanf("%d",&c);

                    if(ListDelete_Sq(s,c,&d))printf("删除元素为%d\n",d);

                        else printf("没有该位置!!!\n");break;

                        }

        case 4:{

                if(s==NULL){printf("请先建表!");break;}

                    printf("请输入获取元素位置:");

                        scanf("%d",&f);

                            if(GetElem_Sq(s,f,&g))printf("该位置元素为%d\n",g);

                                else printf("该位置没有元素!!!\n");break;

                                }

        case 5:{

                if(s==NULL){printf("请先建表!");break;}

                    if(ClearList_Sq(s))printf("重置空表成功!!!\n");break;

                        }

        case 6:{

                if(s==NULL){printf("请先建表!");break;}

                    DestroyList_Sq(s);

                        if(s->elem==NULL)printf("销毁成功!!!\n");break;

                        }

        case 7:{

                if(s==NULL){printf("请先建表!");break;}

                    printf("表长为%d\n",Listlength(s));break;

                    }

        case 8:{if(s==NULL){

                printf("请先建表!");break;}

                    printf("最终数据如下:\n");

                        printfs(s);break;

                        }

    }

    printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");

    ch=getchar();

    scanf("%c",&ch);

   }

}

 

int Initlist_Sq(Sqlist s){//构造一个新的线性表s

    s->elem=(int*)malloc(size*sizeof(int));//为s开辟一个大小为int型的空间

    if(!s->elem)return ERROR;//若建表不成功返回error

    s->length=0;//表长度初始为0

    s->listsize=size;//表空间初始大小为size

    return OK;

}

int ListInsert_Sq(Sqlist s,int i,int e){//在线性表s的第i个元素之前插入新的元素e

    if(i<1||i>s->length)return ERROR;//若需要插入的位置错误返回error

    if(s->length>=s->listsize){//若表的空间不够,在原有地址上增加insize大小的空间

            s->elem=(int*)realloc(s->elem,(s->listsize+insize)*sizeof(int));

            if(s->elem==NULL)return ERROR;

            s->listsize+=insize;//表的空间增加

    }

    int *q,*p;

    q=&s->elem[i-1];

    for(p=&s->elem[s->length-1];p>=q;--p)*(p+1)=*p;//从最后一个位置开始所有元素向后移动一位

    *q=e;//修改第i个元素为目标元素

    s->length++;//表的长度增加

    return OK;

}

int ListDelete_Sq(Sqlist s,int i,int *e){//删除线性表s的第i个元素并用e返回

    if(i<1||i>s->length)return ERROR;//若需要删除的位置错误返回error

    int *q,*p;

    p=&s->elem[i-1];

    *e=s->elem[i-1];

    q=s->elem+s->length-1;

    for(++p;p<=q;p++)*(p-1)=*p;//从第i个位置开始所有元素向前移动一位

    s->length--;//表的长度减少

    return OK;

}

int GetElem_Sq(Sqlist s,int i,int *e){//获取线性表s的第i个元素并用e返回

     if(i<1||i>s->length)return ERROR;//若需要获取的位置错误返回error

     *e=s->elem[i-1];

}

int ListEmpty(Sqlist s){//判断表是否为空表 返回true或者false

    if(s->length==0)return TRUE;

    else return FLASE;

}

int DestroyList_Sq(Sqlist s){//销毁线性表

    if(!ListEmpty(s)){

    free(s->elem);

    s->elem=NULL;

    s->length=0;

    s->listsize;

    }

}

int ClearList_Sq(Sqlist s){//将线性表重置为空表

    if(!ListEmpty(s)){

        for(int i=0;i<s->length;i++){

            s->elem[i]=0;

        }

        s->length=0;

    }

    if(ListEmpty(s))return OK;

}

int Listlength(Sqlist s){//返回表的长度

    return s->length;

}

int OperateMenu(){//建立菜单,提示操作代码

    int num;

    printf("1:建立线性表并输入数据!\n2:插入元素!\n3:删除元素!\n4:获取元素!\n5:重置空表!\n6:销毁线性表!\n7:得到表长!\n8:打印表中内容!\n");//提供菜单选项

    scanf("%d",&num);

    for(int i=0;;i++){

        if(num<1||num>8){printf("选择错误!");return -1;}

        else if(num==1){return num;break;}

        else if(num==2){return num;break;}

        else if(num==3){return num;break;}

        else if(num==4){return num;break;}

        else if(num==5){return num;break;}

        else if(num==6){return num;break;}

        else if(num==7){return num;break;}

        else if(num==8){return num;break;}

    }

}

Sqlist scanfs(){//向线性表赋值并返回基地址到调用处

    printf("请输入需要存放的数据:(输入-1结束)");

    Sqlist L;

    Initlist_Sq(L);//建立新表

    int e;

    for(int i=0;;i++){

        scanf("%d",&e);

        if(e==-1)break;

        L->elem[i]=e;

         L->length++;

         if(L->length>=L->listsize){//若表的空间不够,在原有地址上增加insize大小的空间

            L->elem=(int*)realloc(L->elem,(L->listsize+insize)*sizeof(int));

            if(L->elem==NULL)return ERROR;

            L->listsize+=insize;//表的空间增加

    }

    }//逐个输入元素

    return L;//返回表头

}

void printfs(Sqlist s){//将线性表s中的元素依次打印

    for(int j=0;j<s->length;j++){

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

    }//逐个打印元素

}

实验结果:

  1. 选择建立顺序表并输入数据:1 2 3 4 5 6 7 8 9 10 11 -1(输入-1结束输入)

ae9893c5edb940458801d4d276b9153c.png

  1. 选择插入操作 在3位置前插入333,并选择打印操作展示效果

eb59613f920a4e828f9cf0522dcfaf00.png

  1. 选择删除操作 删除第三个位置的元素并返回删除的值

175b4599515c40628e241085164de274.png

  1. 获取第七个位置的元素

94f0f3ffa2064e69a321e2ade6f48a63.png

  1. 获得线性表的长度

af0c858f23bd4a489d00f12a5e2492f4.png

其余操作不再演示

                                                              链表

实验代码:

#define OK 1

#define ERROR 0

#include <stdio.h>

#include<stdlib.h>

typedef struct LNode{

    int data;

    struct LNode *next;

}Lnode,*LinkList;

LinkList Initlist_L();//建立一个空表,并将表头返回

LinkList Create(LinkList L);//将空表传入,为表中输入元素,在返回表头

int ListInsert_L(LinkList L,int i,int e);//在线性表L的第i个元素之前插入新的元素e

int ListDelete_L(LinkList L,int i,int *e);//删除线性表L的第i个元素并用e返回

int GetElem_Sq(LinkList L,int i,int *e);//获取线性表L的第i个元素并用e返回

int ListLength(LinkList L);//返回元素个数

LinkList ClearList(LinkList L);//清空链表

LinkList DestroyList(LinkList L);//销毁链表

int OperateMenu();//建立菜单,提示操作代码

void printfs(LinkList L);//将线性表L中的元素依次打印

void main(){

    LinkList L=NULL;

    int a,b,c,d,e,f,g;

    char ch;

    printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");

    scanf("%c",&ch);

    while(ch=='Y'||ch=='y'){

    switch(OperateMenu()){

    case 1:L=Create(L);if(L->next!=NULL)printf("创建成功!");break;

        case 2:{

            if(L==NULL){printf("请先建表!");break;}

              printf("请输入插入位置和插入元素:");

                scanf("%d %d",&a,&b);

                  if(!ListInsert_L(L,a,b))printf("插入位置有误!\n");

                  else printf("插入成功!\n");break;

        }

            case 3:{

                   if(L==NULL){printf("请先建表!");break;}

                    printf("请输入删除位置:");

                     scanf("%d",&c);

                      if(ListDelete_L(L,c,&d))printf("删除元素为%d\n",d);

                        else printf("没有该位置!\n");break;

                }

                case 4:{

                    if(L==NULL){printf("请先建表!");break;}

                      printf("请输入获取元素位置:");

                      scanf("%d",&f);

                       if(GetElem_Sq(L,f,&g))printf("获取元素为%d\n",g);

                        else printf("该位置没有元素!\n");break;

                        }

                case 5:{

                    if(L==NULL){printf("请先建表!");break;}

                       printf("最终数据如下:\n");

                        printfs(L);break;

                    }

                case 6:{

                    if(L==NULL){printf("请先建表!");break;}

                       printf("该链表元素个数为:%d\n",ListLength(L));break;

                    }

                    case 7:{

                        if(L==NULL){printf("请先建表!");break;}

                        L=DestroyList(L);

                        if(L==NULL){printf("销毁成功!");break;}

                    }

                    case 8:{

                        if(L==NULL){printf("请先建表!");break;}

                        L=ClearList(L);

                        if(L->next==NULL){printf("清空成功!");break;}

                    }

    }

    printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");

    ch=getchar();

    scanf("%c",&ch);

    }

}

LinkList Initlist_L(){//建立一个空表,并将表头返回

    LinkList L;

    L=(LinkList)malloc(sizeof(Lnode));

    L->data=0;

    L->next=NULL;

    return L;

}

LinkList Create(LinkList L){//将空表传入,为表中输入元素,在返回表头

    L=Initlist_L();//先建立一个带头节点的链表

    LinkList p,s;

    int e;

    p=L;

    printf("请输入初始数据:(输入-1结束)");

    scanf("%d",&e);

    while(e!=-1)

    {

        s = (LinkList)malloc(sizeof(Lnode));

        s->data=e;

        p->next=s;

        p=s;//插入到表尾

        L->data++;

        scanf("%d",&e);

    }

    p->next=NULL;

    return L;

}

int ListInsert_L(LinkList L,int i,int e){//在线性表L的第i个元素之前插入新的元素e

    LinkList p=L;

    int j=0;

    while(p&&j<i-1){//判断所找元素是否越界

        p=p->next;

        j++;

    }

    if(!p||j>i-1)return ERROR;

    LinkList s=(LinkList)malloc(sizeof(Lnode));//生成新节点

    s->data=e;

    s->next=p->next;//插入L中

    p->next=s;

    return OK;

}

int ListDelete_L(LinkList L,int i,int *e){//删除线性表L的第i个元素并用e返回

    LinkList p=L;

    int j=0;

    while(p&&j<i-1){//判断所找元素是否越界

        p=p->next;

        j++;

    }

    if(!p||j>i-1)return ERROR;//删除位置不合理

    LinkList s=p->next;

    p->next=s->next;

    *e=s->data;

    free(s);//释放结点

    return OK;

}

int GetElem_Sq(LinkList L,int i,int *e){//获取线性表L的第i个元素并用e返回

    LinkList p=L;

    int j=0;

    while(p&&j<i){//判断所找元素是否越界

        p=p->next;

        j++;

    }

    if(!p)return ERROR;//第i个元素不存在

    else OK;

    *e=p->data;//返回i值

}

int ListLength(LinkList L){//返回元素个数

    return L->data;

}

LinkList DestroyList(LinkList L){//销毁链表

    LinkList p;

    while(L!=NULL){

        p=L;

        L=L->next;

        free(p);

    }

    return L;

}

LinkList ClearList(LinkList L){//清空链表

    L->next=NULL;

    L->data=0;

    return L;

}

int OperateMenu(){//建立菜单,提示操作代码

    int num;

    printf("1:建立线性表并输入数据!\n2:插入元素!\n3:删除元素!\n4:获取元素!\n5:打印表中内容!\n6:输出元素个数!\n7:销毁链表!\n8:清空链表!\n");

    scanf("%d",&num);

    for(int i=0;;i++){

        if(num<1||num>8){printf("选择错误!");return -1;}

        else if(num==1){return num;break;}

        else if(num==2){return num;break;}

        else if(num==3){return num;break;}

        else if(num==4){return num;break;}

        else if(num==5){return num;break;}

        else if(num==6){return num;break;}

        else if(num==7){return num;break;}

        else if(num==8){return num;break;}

    }

}

void printfs(LinkList L){//将线性表L中的元素依次打印

    LinkList p=L->next;

    if(p!=NULL){

    for(int j=0;;j++){

        printf("%d\t",p->data);

        p=p->next;

        if(p==NULL)break;

    }

    }

    else printf("该链表为空!\n");

}

实验结果:

  1. 选择建立顺序表并输入数据:10 20 30 40 50 60 70 80 90 -1(输入-1结束输入7a66d66bdf2644b1aded6f87f0fa3486.png

 

 

 

  1. 选择插入元素 输入插入位置3和插入元素300,并打印结果

d49968f6ac6045408774e14b3ef25ed5.png

  1. 删除第三位元素并返回删除元素

d5d3ce1e239749ed91d973384ea63af3.png

  1. 获取第七位的元素

53aff3d42d4b4132ba90a4e6cb4a8381.png

  1. 输出元素个数

abe7945a17f44b83a7e8498d6f947552.png

其余操作不再演示

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值