顺序表

warning: 这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。

c语言和c++混用,写的比较乱。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include"sqlist.h"
using namespace std;
 
#define MAXSIZE 128
#define LISTINCREMENT 10
#define error 0
#define ok 1
 
typedef struct {
    int *elem;//存储空间首地址
    int length;//当前长度
    int listsize;//当前分配的存储容量
}SqList; //定义结构体
 
SqList createlist() {
    SqList* list=(SqList*)malloc(sizeof(SqList));
    return *list;
}//创建顺序表
 
int initlist(SqList &L) {
    L.elem=(int*)malloc(sizeof(int)*MAXSIZE);
    if(!L.elem)
        return error;//内存分配失败,存储空间不够
    L.length=0;//初始化顺序表长度
    L.listsize = MAXSIZE;//顺序表最大存储单元个数
    return ok;//初始化顺序表成功
}//初始化顺序表
 
void printlist(SqList &L) {
    for(int i; i<L.length; i++)
        cout<<L.elem[i]<<" ";
    cout<<endl;
}
 
int insertlist(SqList &L,int index,int value) {
    if (index>L.listsize) {
        printf("插入的下标位置超出顺序表长度");
        return error;
    }else if(index<0) {
        printf("插入的下标位置为负数");
        return error;
    }else if(index<=L.length){
        if(L.length == L.listsize) {
            printf("顺序表已满,将申请更大的新内存空间替换原顺序表内存空间\n");
            int* newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));//比原顺序表多10单位类型长度
            if(!newbase)
                return error;//内存分配失败,存储空间不够
            L.elem=newbase;
            L.listsize+=LISTINCREMENT;
            for(int i=index; i<L.length; i++)//初始化新增空间元素
                L.elem[i]=0;
        }
        for(int i=L.length; i>index; i--) //逆序移位
            L.elem[i]=L.elem[i-1];//从插入位置开始,后面元素依次右移一位
        L.elem[index]=value;//插入元素
        L.length++;
    }
    return ok;
}//插入元素到顺序表
 
int removelist(SqList &L,int value) {
    int index=-1;
    for(int i=0; i<L.length; i++) { //根据需删除元素值查找其下标
        if(L.elem[i]==value) {
            index=i;
            break;
        }
    }
    if(index==-1) {
        return error;
    }
    for(index; index<L.length-1; index++) //顺序移位
        L.elem[index]=L.elem[index+1];//从删除位置开始,后面元素依次左移一位
    L.length--;
    return ok;
}//根据需删除元素值查找并删除
 
int removelist(SqList &L,int index,int &elem) {
    if(index>=L.length)//下标超出当前顺序表长度
        return error;
    else if(index<0)//下标为负数
        return error;
    else {
        for(int i=index; i<L.length-1; i++) //顺序移位
            L.elem[i]=L.elem[i+1];//从删除位置开始,后面元素依次左移一位
        L.length--;
        return ok;
    }
}//根据需删除元素下标查找并删除
 
void destroylist(SqList &L) {
    free(L.elem); //释放存储空间
    L.length = 0;
    exit(0);
}//删除顺序表
 
int searchlistlen(SqList &L) {
    return L.length;
}
 
int searchlist(SqList &L,int index,int &elem) {
    if(index<L.length) {
        cout<<L.elem[index]<<endl;
        return ok;
    } else
        return error;
}
 
int searchlist(SqList &L,int value) {
    for(int i; i<L.length; i++) {
        if(L.elem[i]==value)
            return ok;
    }
    return error;
}
 
void endsystem(SqList& L) {
    destroylist(L);
    exit(0);
}
 
void SqListMenu() {
    cout<<"1.初始顺序表\n";
    cout<<"2.输出顺序表\n";
    cout<<"3.插入元素\n";
    cout<<"4.根据下标删除元素\n";
    cout<<"5.根据值删除元素\n";
    cout<<"6.删除顺序表\n";
    cout<<"7.返回顺序表长度\n";
    cout<<"8.根据下标查询元素\n";
    cout<<"9.根据值查询元素\n";
    cout<<"0.退出程序\n";
}
 
int main() {
    SqList L;
    int elem;
    bool flag=true;
    while(flag) {
        SqListMenu();
        printf("请输入数字选择功能:");
        int n;
        cin>>n;
        switch(n) {
            case 1: {
                if(initlist(L))
                    cout<<"成功初始化线性表"<<endl;
                else
                    cout<<"初始化线性表失败"<<endl;
                break;
            }
            case 2: {
                printlist(L);
                break;
            }
            case 3: {
                int i,v;
                cout<<"请输入要插入的元素位置和值:";
                cin>>i>>v;
                if(insertlist(L,i,v))
                    cout<<"插入完成"<<endl;
                else
                    cout<<"插入失败"<<endl;
                break;
            }
            case 4: {
                int i;
                cout<<"请输入要删除的元素下标:";
                cin>>i;
                if(removelist(L,i,elem))
                    cout<<"删除成功"<<endl;
                else
                    cout<<"删除失败"<<endl;
                break;
            }
            case 5: {
                int v;
                cout<<"请输入要删除的元素值:";
                cin>>v;
                if(removelist(L,v))
                    cout<<"删除成功"<<endl;
                else
                    cout<<"删除失败"<<endl;
                break;
            }
            case 6: {
                destroylist(L);
                break;
            }
            case 7: {
                cout<<"顺序表长度为"<<searchlistlen(L)<<endl;
                break;
            }
            case 8: {
                int i;
                cout<<"请输入要查询的元素下标:";
                cin>>i;
                if(searchlist(L,i,elem))
                    cout<<"查询成功"<<endl;
                else
                    cout<<"查询失败"<<endl;
                break;
            }
            case 9: {
                int v;
                cout<<"请输入要查询的元素值:";
                cin>>v;
                if(searchlist(L,v))
                    cout<<"查询成功"<<endl;
                else
                    cout<<"查询失败"<<endl;
                break;
            }
            case 0: {
                flag=false;
                endsystem(L);
            }
        }
        printf("\n");
    }
}

头文件代码(仅有声明函数并宏定义作用)

#ifdef SQLIST_H_
#define SQLIST_H_
#define MAXSIZE 128
#define LISTINCREMENT 10
typedef struct{
    int *elem;//存储空间首地址
    int length;//当前长度
    int listsize;//当前分配的存储容量
}SqList;//定义结构体
SqList createlist();
int initlist(SqList &);
int insertlist(SqList &,int);
int removelist(SqList &,int,int &);
int removelist(SqList &,int);
void destroy(SqList &);
int searchlistlen(SqList &);
int searchlist(SqList &,int,int &);
void endsystem();
void endsystem();
void SqListMenu();
#endif

已修正原代码中顺序表relloc扩容时出现的多个错误(2023.7.6)

--------根据严蔚敏版数据结构编写

none
最后修改于:2023年11月25日 18:37

评论已关闭