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);
}
可扩容的线性表
最新推荐文章于 2024-10-08 20:32:22 发布