順序表是用一段物理地址連續的存盤單元依次存盤資料元素的線性結構,一般情況下采用陣列存盤,在陣列上完成資料的增刪查改,使用定長陣列存盤的是靜態順序表,使用動態開辟的陣列存盤的是動態順序表,
以下是動態順序表增刪改查功能的實作:
//seqlist.h
#pragma once
#include <stdio.h>
#include<assert.h>
#include <stdlib.h>
typedef int SLDatatype;
typedef struct Seqlist
{
SLDatatype* a;
size_t size;
size_t capacity;
}Seqlist;
//對資料的管理 增刪改查
void SeqListInit(Seqlist* ps);
void SeqListDestory(Seqlist* ps);
void SeqListPrint(Seqlist* ps);
void SeqListPushBack(Seqlist* ps, SLDatatype x); //尾插
void SeqListPushFront(Seqlist* ps, SLDatatype x); // 頭插
void SeqListPopBack(Seqlist* ps); //尾刪
void SeqListPopFront(Seqlist* ps); // 頭刪
int SeqListFind(Seqlist*ps, SLDatatype x);//順序表查找
void SeqListInsert(Seqlist*ps, size_t pos, SLDatatype x);//順序表在pos處插入x
void SeqListErase(Seqlist*ps, size_t pos);//洗掉pos位置的值
//seqlist.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <windows.h>
#include<assert.h>
#include "seqlist.h"
void SeqListInit(Seqlist* ps)
{
assert(ps);
ps ->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
void SeqListDestory(Seqlist* ps){
assert(ps);
free(ps->a);
ps->a = NULL;
ps->size = ps->capacity = 0;
}
void SeqListPrint(Seqlist* ps)
{
assert(ps);
for (size_t i = 0; i < ps->size; ++i)
{
printf("%d", ps->a[i]);
}
printf("\n");
}
void CheckCapacity(Seqlist*ps){ //容量檢查及增容
if (ps->size == ps->capacity)
{
size_t newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; //判斷之前的記憶體大小是否為零
ps->a = (SLDatatype*)realloc(ps->a, newcapacity*sizeof(SLDatatype));
ps->capacity = newcapacity;
}
}
void SeqListPushBack(Seqlist* ps, SLDatatype x) //尾插
{
assert(ps);
CheckCapacity(ps);
ps->a[ps->size] = x; //以陣列形式存盤
ps->size++;
}
void SeqListPushFront(Seqlist* ps, SLDatatype x) // 頭插
{
assert(ps);
CheckCapacity(ps);
size_t end = ps->size;
while (end > 0)
{
ps->a[end] = ps->a[end - 1];
--end;
}
ps->a[0] = x;
++ps->size;
}
void SeqListPopBack(Seqlist* ps)//尾刪
{
assert(ps);
ps->size--;
}
void SeqListPopFront(Seqlist* ps) // 頭刪
{
assert(ps);
size_t start = 0;
while (start < ps->size-1) //控制邊界
{
ps->a[start] = ps->a[start + 1];
++start;
}
--ps->size;
}
int SeqListFind(Seqlist* ps, SLDatatype x)//順序表查找
{
for (size_t i = 0; i < ps->size;++i)
{
if (ps->a[i] == x)
{
return i;
}
}
return -1;
}
void SeqListInsert(Seqlist*ps, size_t pos, SLDatatype x)//順序表在pos處插入x
{
assert(ps);
assert(pos < ps->size);
CheckCapacity(ps);
size_t end = ps->size;
while (end > pos)
{
ps->a[end + 1] = ps->a[end-1];
--end;
}
ps->a[pos] = x;
ps->size++;
}
void SeqListErase(Seqlist*ps, size_t pos)//洗掉pos位置的值
{
assert(ps);
assert(pos < ps->size);
size_t start = pos;
while (start < ps->size-1)
{
ps->a[start] = ps->a[start + 1];
++start;
}
ps->size--;
}
void TestSeqList()
{
Seqlist s;
SeqListInit(&s);
SeqListPushBack(&s, 1);
SeqListPushBack(&s, 2);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 4);
SeqListPushBack(&s, 5);
SeqListPrint(&s);
SeqListPushFront(&s, 1);
SeqListPushFront(&s, 2);
SeqListPushFront(&s, 3);
SeqListPushFront(&s, 4);
SeqListPushFront(&s, 5);
SeqListPrint(&s);
SeqListPopFront(&s);
SeqListPopFront(&s);
SeqListPopFront(&s);
SeqListPrint(&s);
SeqListPopBack(&s);
SeqListPopBack(&s);
SeqListPrint(&s);
SeqListFind(&s,4);
SeqListPrint(&s);
SeqListInsert(&s,3,3);
SeqListPrint(&s);
SeqListErase(&s, 2);
SeqListPrint(&s);
SeqListDestory(&s);
}
int main(){
TestSeqList();
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/281676.html
標籤:其他
上一篇:老大讓我優化資料庫,我上來就分庫分表,他過來就是一jio
下一篇:C++ 中的繼承
