顺序表的实现

使用前提:会使用C/C++,了解数据结构基础


描述:创建并使用顺序表


说明:

1:只能按顺序插入,不能随机插入;2:如过你的环境中可以支持#include<conio.h>头文件就更好了,可以解锁s没有也不影响;

 

例如:先插入第一个与第二个位置之后才能插入第三个位置,总之需要前面的位置都有数据存在

 


具体代码实现:

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

 

#define MAXSIZE 100

 

typedef int DataType;

typedef struct{

    DataType *data;

    // 空间大小

    int size;

    int length;

}SeqList;

// void wait(){

//     printf("\n为什么消灭私有制保护打工者的利益?,请按任意键继续\n");

//     getch();

   

// }

int go_on(){

    int flag=1,i;

    char choice;

    while (1) {

        printf("继续请输入1,停止请输入0\n");

        scanf("%d",&i);

        if (i==1) {

        break;

        }

        else if (i==0) {

        flag=0;

        break;

        }

        else {

        printf("请按要求输入,谢谢\n");

        }

    }

    return (flag);

}

// 初始化

void Init_SeqList(SeqList *L,int n){

L->data=(DataType *)malloc(n*sizeof(DataType));

if(!L->data){

    printf("内存分配失败\n");

    exit(-1);

    }

    L->length=0;

}

 

// 插入运算

int Insert_SeqList(SeqList *L,int i,DataType x){

    DataType *p,*q;

    if (L->length==MAXSIZE){

        printf("\n表满不能插入\n");

        return (-1);

    }

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

   printf("\n插错位置,不能插入\n");

   return (0);

    }

    // q指向插入位置

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

    for(p=&(L->data[L->length-1]);p>=q;p--){

        *(p+1)=*p;  /*元素向后移一位*/

    }

    *q=x;

    L->length++;

    return (1);

}

void Insert(SeqList *L){

    DataType x;

    int i,flag=1,insert_flag;

    while (flag) {

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

        scanf("%d",&i);

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

        scanf("%d",&x);

        insert_flag=Insert_SeqList(L,i,x);

        if (insert_flag==1){

        printf("\n插入成功\n");

        }

        else

            printf("\n插入失败\n");

        flag=go_on();

    }

}

// 删除运算

int Delete_SeqList(SeqList *L,int i){

    DataType *p,*q;

    // 表空不能删除,删除失败返回-1

    if (L->length==0) {

        printf("\n表空,不能删除\n");

        return (-1);

    }

    // 删除位置错误不能删除

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

        printf("\n删除位置错误,不能删除\n");

        return (0);

    }

    q=&(L->data[L->length-1]);/*q指向最后一个元素位置*/

    // 元素向前移动

    for(p=&(L->data[i]);p<=q;p++){

        *(p-1)=*p;  

    }

    // 当前表长度减一

    L->length--;

    return (1);

}

void Delete(SeqList *L){

    int i,flag=1,delete_flag;

    while (flag) {

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

        scanf("%d",&i);

        delete_flag=Delete_SeqList(L,i);

        if (delete_flag==1) {

        printf("\n删除成功\n");

        }

        else {

        printf("\n删除失败\n");

        }

        flag=go_on();

    }

}

// 按值查找运算,在顺序表中查找元素x,成功则返回x位置的序号,若查找失败返回-1

int Locate_SeqList(SeqList *L,DataType x){

    DataType *p;

    int i;

    i=0;

    p=L->data;

    while (i<=L->length-1&&*p!=x) {

    i++;

    p++;

    }

    if(i>L->length-1){

        return (-1);

    }

    // 查找成功返回x的位置序号(第几个)

    else {

    return (i+1);

    }

}

void Locate(SeqList *L){

DataType x;

int flag=1,locate_flag;

while (flag) {

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

    scanf("%d",&x);

    locate_flag=Locate_SeqList(L,x);

    if(locate_flag>0){printf("\n查找成功,%d是第%d个元素\n",x,locate_flag);

    }

    else printf("\n查找失败,没有元素\n");

    flag=go_on();

}

}

// 输出顺序表

void Display_SeqList(SeqList *L){

    int i;

    printf("\n顺序表全部元素\n");

    for(i=0;i<=L->length-1;i++){

        printf("%4d",L->data[i]);

        printf("\n");

    }

}


 

// 销毁顺序表

// void DestroyList(SeqList *L);

 

main(){

    SeqList L;

    int flag=1,j;

    Init_SeqList(&L,MAXSIZE);

    do {

        printf("\n");

        printf("-------顺序表动态数组的实现---------\n");

        printf("插入元素请摇1\n");

        printf("删除元素请摇2\n");

        printf("查找元素请摇3\n");

        printf("输出元素请摇4\n");

        printf("退出请摇0\n");

        printf("----------------------\n");

        scanf("%d",&j);

        switch (j) {

        case 1:Insert(&L);break;

        case 2:Delete(&L);break;

        case 3:Locate(&L);break;

        case 4:Display_SeqList(&L);break;

        case 0:flag=0;printf("感谢大哥的使用\n");break;

        }

    }while (flag==1);

}


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值