可扩容的线性表

dsqlist.cpp



#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#include"dsqlist.h"
#include<assert.h>
#include<stdlib.h>

#define INIT_SIZE 10
//初始化
void  InitSqlist(DSQList ps) {
    assert(ps != NULL);
    if (ps == NULL) {
        return;
    }
    ps->elem = (int*)malloc(INIT_SIZE * sizeof(int));
    ps->length = 0;
    ps->lengthsize = INIT_SIZE;
}

//判满
static bool IsFull(DSQList ps)
{
    return ps->length == ps->lengthsize;
}

//扩容
static bool Inc(DSQList ps) {
    ps->elem= (int*)realloc(ps->elem, (INIT_SIZE*2) * sizeof(int));
    assert(ps != NULL);
    ps->lengthsize *= 2;
    return true;
}

//插入数据,在顺序表ps的pos位置插入val;
bool Insert(DSQList ps, int pos, int val) {
    assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    if (pos < 0 || ps->length < pos) {
        return false;
    }
    if (IsFull(ps)) {
        Inc(ps);
    }
    for (int i = ps->length - 1; i >= pos; i--) {
        ps->elem[i + 1] = ps->elem[i];
    }
    ps->elem[pos] = val;
    ps->length++;

    return true;

}
//判空
bool IsEmpty(DSQList ps)
{
    return ps->length == 0;
}

//在ps中查找第一个key值,找到返回下标,没有找到返回-1
int  Search(DSQList ps, int key) {
    assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    for (int i = 0; i < ps->length; i++) {
        if (key == ps->elem[i]) {
            return i;
        }
    }
    return -1;
}

//删除pos位置的值
bool  DelPos(DSQList ps, int pos) {
    assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    if (pos < 0 || ps->length < pos) {
        return false;
    }
    for (int i = pos; i <= ps->length - 1; i++) {
        ps->elem[i] = ps->elem[i + 1];
    }
    ps->length--;
    return true;
}

//删除第一个val的值
bool  DelVal(DSQList ps, int val) {
    assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    /*for (int i = 0; i <= ps->length - 1; i++) {
        if (val == ps->elem[i]) {
            ps->elem[i] = ps->elem[i + 1];
            break;
        }
        ps->length--;
    }*/
    int i = Search(ps, val);
    if (i <= 0) {
        return false;
    }
    return DelPos(ps, i);

}

//返回key的前驱下标,如果不存在返回-1
int  GetPrio(DSQList ps, int key) {
    /*assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    for (int i = 0; i < ps->length; i++) {
        if (key == ps->elem[i]) {
            return i - 1;
        }
        if (i > ps->length - 1) {
            return -1;
        }
    }*/
    int i = Search(ps, key);
    if (i <= 0)
        return -1;
    return i - 1;
}

//返回key的后继下标,如果不存在返回-1
int  GetNext(DSQList ps, int key) {
    /*assert(ps != NULL);
    if (ps == NULL) {
        return false;
    }
    for (int i = 0; i < ps->length - 1; i++) {
        if (key == ps->elem[i]) {
            return i + 1;
        }
        if (i > ps->length - 1) {
            return -1;
        }
    }*/
    int i = Search(ps, key);
    if (i == ps->length - 1 || i < 0)
        return -1;
    return i + 1;
}

//返回线性表的长度
int Getlength(DSQList ps) {
    return ps->length;
}
//输出
void  Show(DSQList ps) {
    assert(ps != NULL);
    if (ps == NULL) {
        return ;
    }
    for (int i = 0; i < ps->length; i++) {
        printf("%d ", ps->elem[i]);
    }
    printf("\n");
}

//清空数据
void  Clear(DSQList ps) {
    ps->length = 0;
}

//销毁整个内存
void  Destroy(DSQList ps) {
    free(ps->elem);
    ps->elem = NULL;
    ps->length = 0;
    ps->lengthsize = 0;
    ps = NULL;//无用 error
}

//比较顺序表大小
int comparelist(SQList list1, SQList list2) {

    if (list1.length > list2.length) {
        return 1;
    }
    else if (list1.length < list2.length) {
        return -1;
    }

    for (int i = 0; i < list1.length; i++) {
        if (list1.elem[i] > list2.elem[i]) {
            return 1;
        }
        else if (list1.elem[i] < list2.elem[i]) {
            return -1;
        }
    }
    return 0;
}

//顺序表的逆置
int reverse(DSQList ps) {
    int i = 0;
    int j = ps->length - 1;
    while (i < j) {
        int tmp = ps->elem[i];
        ps->elem[i] = ps->elem[j];
        ps->elem[j] = tmp;
        i++;
        j--;
    }
    return 1;
}


//插入元素后顺序表依然有序
void insert_num(DSQList ps,int x) {
    for (int i = 0; i < 25; i++) {
        if (x < ps->elem[i]) {
            Insert(ps, i, x);
            break;
        }
    }
}








dsqlist.h



#pragma once
#pragma once
#include<stdlib.h>
//预防头文件被重复引用

//定长顺序表
//定义与声明

typedef struct  SQList
{
    int* elem;//存放数据,固定长度为10;
    int length;//有效数据的个数
    int lengthsize;//总长度
}SQList, * DSQList;


//初始化
void  InitSqlist(DSQList ps);

//插入数据,在顺序表ps的pos位置插入val;
bool Insert(DSQList ps, int pos, int val);

//判满
static bool IsFull(DSQList ps);


//扩容
static bool Inc(DSQList ps);

//判空
bool  IsEmpty(DSQList ps);

//在ps中查找第一个key值,找到返回下标,没有找到返回-1
int  Search(DSQList ps, int key);

//删除pos位置的值
bool  DelPos(DSQList ps, int pos);

//删除第一个val的值
bool  DelVal(DSQList ps, int val);

//返回key的前驱下标,如果不存在返回-1
int  GetPrio(DSQList ps, int key);

//返回key的后继下标,如果不存在返回-1
int  GetNext(DSQList ps, int key);

//返回线性表地长度
int Getlength(DSQList ps);

//输出
void  Show(DSQList ps);

//清空数据
void  Clear(DSQList ps);

//销毁整个内存
void  Destroy(DSQList ps);

//比较顺序表大小
int comparelist(SQList list1, SQList list2);

//顺序表的逆置
int reverse(DSQList ps);


//插入元素后顺序表依然有序
void insert_num(DSQList ps, int x);









test.cpp



#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#include"dsqlist.h"
int main() {
    SQList dsq;
    InitSqlist(&dsq);
    for (int i = 0; i < 25; i++)
    {
        Insert(&dsq, i, i);
    }
    Show(&dsq);
    printf("长度为:%d", Getlength(&dsq));
    printf("\n");

    printf("判断线性表是否为空(1表示空,0表示不为空)\n");
    printf("%d\n", IsEmpty(&dsq));
    printf("\n");

    printf("请输入要查找的数:\n");
    int key1;
    scanf("%d", &key1);
    if (key1 == Search(&dsq, key1)) {
        printf("已找到,要查找的值为:%d\n", Search(&dsq, key1));
    }
    else {
        printf("未能查找到该数\n");
    }
    printf("\n");


    printf("请输入需要返回前驱和后继的值:\n");
    int key;
    scanf("%d", &key);
    int x = GetPrio(&dsq, key);
    int y = GetNext(&dsq, key);
    printf("%d的前驱是:%d\n", key, x);
    printf("%d的后继是:%d\n", key, y);
    printf("\n");

    printf("请输入要删除的位置\n");
    int val;
    scanf("%d", &val);
    DelPos(&dsq, val);
    printf("删除后链表为:\n");
    Show(&dsq);
    printf("\n");


    printf("请输入要删除的第一个数字\n");
    int key2;
    scanf("%d", &key2);
    DelVal(&dsq, key2);
    printf("删除后链表为:\n");
    Show(&dsq);
    printf("\n");


    printf("插入元素后依然有序\n");
    int num = 4;
    insert_num(&dsq, num);
    printf("插入%d后顺序表为:\n", num);
    Show(&dsq);


    SQList list1;
    InitSqlist(&list1);
    Insert(&list1, 0, 1);
    Insert(&list1, 1, 2);
    Insert(&list1, 2, 3);
    printf("list1:");
    Show(&list1);
    SQList list2;
    InitSqlist(&list2);
    Insert(&list2, 0, 1);
    Insert(&list2, 1, 2);
    Insert(&list2, 2, 4);
    printf("list2:");
    Show(&list2);
    comparelist(list1, list2);
    if (comparelist(list1, list2) == 1) {
        printf("list1 > list2\n");
    }else if (comparelist(list1, list2) == -1) {
        printf("list1 < list2\n");
    }
    else {
        printf("list1 = list2\n");
    }


    reverse(&dsq);
    printf("逆置后顺序为:\n");
    Show(&dsq);

    //清空数据
    //Clear(&dsq);

    //销毁整个内存
    //Destroy(&dsq);


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值