2025王道考研13页2.1.2参考代码(动态数组版本)

#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define InitSize 100//表的初始长度定义 
typedef struct{
    int *data;
    int MaxSize,length;
}SeqList;
//初始化动态顺序表 
void InitList(SeqList &L){
    L.data=(int*)malloc(sizeof(int)*InitSize);
    L.MaxSize=InitSize;
    L.length=0;
    printf("初始化动态顺序表成功!");
}
//创建动态态顺序表
void CreateList(SeqList &L) {
    int num;  
    printf("请输入要往顺序表中加入的整数(输入9999退出):");  
    while(scanf("%d", &num) == 1 && num != 9999 && L.length < L.MaxSize)  
    {  
        L.data[L.length++] = num;  
        printf("顺序表的长度是:%d\n", L.length);  
        printf("剩余位置的数量:%d\n", L.MaxSize - L.length);  
        printf("请输入要往顺序表中加入的整数(输入9999退出):");  
    }  
}
//初始化动态顺序表 
void TravelList(SeqList &L){
    for(int i=0;i<L.length;i++){
        printf("%d ",L.data[i]);
    }
    printf("\n");
}
//求表长 
void length(SeqList L){
    printf("%d\n",L.length);
}
//按值查找操作
void Locate(SeqList L,int e){
    int count=0;
    for(int i=0;i<L.length;i++){
        if(L.data[i]==e){
            printf("%d出现在顺序表的第%d个位置!\n",e,(i+1));
            count+=1;
        }
    }
    if(count==0)
        printf("在顺序表中没有找到元素%d\n",e); 
}
//按位查找操作
int GetElem(SeqList L,int i){
    if(i<0||i>L.length)
        return -1;
    else
        return L.data[i-1];
}
//插入操作(在L中的第i个位置插入指定元素e)
void ListInsert(SeqList &L,int i,int e){
    if(i<=0||i>L.length+1){
        printf("插入的位置不合法!");
        return;
    }
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;//思路简单记忆:先从后往前往后挪,直到要插入位置的下一个位置,然后赋值该位置 
    L.length++;
}
//删除操作删除表L中第i个位置的元素,并且用e返回删除元素的值
bool ListDelete(SeqList &L,int i,int &e){
    if(i<=0||i>L.length){
        return 0;
    }
    e=L.data[i-1];
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];
    }//思路简记:先把值赋给e然后从前往后往前挪 
    L.length-=1;
    return 1;
}
//判断动态顺序表是否空 
bool Empty(SeqList L){
    if(L.length)
        return 1;
    else
        return 0;
}
//销毁动态顺序表
void Destory(SeqList &L){
    free(L.data);  
    // 将指针设为NULL,防止悬挂指针  
    L.data = NULL;  
    // 可以选择将MaxSize和length设为0,但这不是必须的,因为结构体的内存已经被释放  
    L.MaxSize = 0;  
    L.length = 0;
    printf("销毁动态顺序表成功!");

int main()
{
    SeqList L;
    int choice;
    do {
        printf("\n请选择操作:\n");  
        printf("1. 初始化表\n");
        printf("2. 创建表\n");
        printf("3. 遍历表\n");
        printf("4. 获取长度\n");
        printf("5. 按值查找\n");
        printf("6. 按位查找\n"); 
        printf("7. 按位插入\n");
        printf("8. 按位删除\n");
        printf("9. 判空\n");
        printf("10.销毁表\n");
        printf("11. 退出\n");
        scanf("%d",&choice);
        switch (choice) {
            case 1:{
                InitList(L);
                break;
            }
            case 2:{
                CreateList(L);
                break;
            }
            case 3:{
                printf("遍历顺序表得到的结果是:");
                TravelList(L);  
                break;
            }
            case 4:{
                printf("当前的表长是:");
                length(L);
                break;
            }
            case 5:{
                int e;  
                printf("按值查找请输入:");  
                scanf("%d", &e);  
                Locate(L, e);  
                break;
            }
            case 6: {
                int i;
                printf("按位查找请输入:");
                scanf("%d",&i);
                printf("顺序表中第%d个元素是%d(如果是-1代表没找到)",i,GetElem(L,i));
                break;
            }
            case 7:  {
                int i,e;
                printf("请输入要插入元素的位置:");
                scanf("%d",&i);
                printf("请输入要插入元素值:");
                scanf("%d",&e);
                ListInsert(L,i,e);
                printf("插入后的顺序表是:");
                TravelList(L);
                printf("插入后的顺序表的表长是:");
                length(L);
                break;
            }
            case 8:{
                int i,e;
                printf("请输入要删除元素的位置:");
                scanf("%d",&i);
                if(ListDelete(L,i,e)){
                    printf("删除第%d个位置的元素成功!\n",i);
                    printf("删除的元素是:%d/n",e);
                    printf("删除后的顺序表是:");
                    TravelList(L);
                    printf("删除后的顺序表的表长是:");
                    length(L);
                }
                else    
                    printf("输入的删除位置不合法!");    
                break;
            }
            case 9:{
                if(Empty(L))
                    printf("静态顺序表非空!");
                else
                    printf("静态顺序表空了!");
                break;
            }
            case 10:{
                Destory(L);
                break;
            }
            case 11:
                printf("程序退出。\n");  
                break;
            default:  
                printf("无效的选择,请重新输入。\n");
        }
    } while(choice!=11);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值