顺序存储结构
顺序存储结构其主要使用的是数组来存储数据的, 所以它的特点是:查询快,增删慢!
为什么增删慢呢?由于增删需要把插入的位置元素后移或者前移 所以效率就要慢了!当然如果是插入在末尾的话 就另当别论了!
插入的核心代码:
for (i = arrayList->length; i > pos; i--) {
//元素后移
arrayList->node[i] = arrayList->node[i - 1];
};
//插入元素
arrayList->node[pos] = (unsigned int)node;
arrayList->length ++;
删除的核心代码:
for (i = pos + 1; i < arrayList->length; i++) {
arrayList->node[i - 1] = arrayList->node[i];
}
arrayList->length--;
下面来看看头文件:
seqList.h
#ifndef _SEQ_LIST_
#define _SEQ_LIST_
typedef void SeqList;
typedef void SeqListNode;
SeqList* seqList_create(int capacity);
void seqList_destory(SeqList* list);
void seqList_clear(SeqList* list);
int seqList_length(SeqList* list);
int seqList_capacity(SeqList* list);
int seqList_insert(SeqList* list,SeqListNode* node,int pos);
SeqListNode* seqList_get(SeqList* list,int pos);
SeqListNode* seqList_delete(SeqList* list,int pos);
#endif
再来看看实现 重点是插入和删除的方法
seqList.c
#include <string.h>
#include "seqList.h"
typedef struct _tag_list {
int length;//数组长度
int capacity;//开辟的空间大小
unsigned int* node;//存储指针的数组
}ArrayList;
SeqList* seqList_create(int capacity) {
int ret = 0;
ArrayList *list = NULL;
list = (ArrayList*)malloc(sizeof(ArrayList));//分配内存空间
if (list == NULL)
{
return NULL;
}
memset(list, 0, sizeof(ArrayList));
list->node = (unsigned int *)malloc(sizeof(unsigned int)*capacity);//分配存储数组下标的内存空间
if (list->node == NULL)
{
return NULL;
}
list->capacity = capacity;
list->length = 0;
return list;
}
//释放内存
void seqList_destory(SeqList* list) {
ArrayList *arrayList;
if (list == NULL) { return; }
arrayList = (ArrayList*)list;
if (arrayList->node == NULL)
{
return;
}
free(arrayList->node);
free(arrayList);
}
//清理 回到初始状态
void seqList_clear(SeqList* list) {
ArrayList *arrayList;
if (list == NULL) { return; }
arrayList = (ArrayList*)list;
arrayList->length = 0;
}
//获取长度
int seqList_length(SeqList* list) {
ArrayList *arrayList;
if (list == NULL) { return -1; }
arrayList = (ArrayList*)list;
return arrayList->length;
}
//获取空间大小
int seqList_capacity(SeqList* list) {
ArrayList *arrayList;
if (list == NULL) { return -1; }
arrayList = (ArrayList*)list;
return arrayList->capacity;
}
//插入一个数据
int seqList_insert(SeqList* list, SeqListNode* node, int pos) {
if (list == NULL || node == NULL || pos<0) {
return -1;
}
int i = 0;
ArrayList* arrayList = NULL;
arrayList = (ArrayList*)list;
if (arrayList->capacity <= arrayList->length) {//判断是否已满
return -1;
}
if (pos >= arrayList->length)
{
pos = arrayList->length;
}
for (i = arrayList->length; i > pos; i--) {
//元素后移
arrayList->node[i] = arrayList->node[i - 1];
};
//插入元素
arrayList->node[pos] = (unsigned int)node;
arrayList->length ++;
return 0;
}
SeqListNode* seqList_get(SeqList* list, int pos) {
ArrayList* arrayList = NULL;
SeqListNode* ret = NULL;
arrayList = (ArrayList*)list;
if (list == NULL || pos<0||pos>= arrayList->length)
{
return NULL;
}
ret= (SeqListNode*)arrayList->node[pos];
return ret;
}
SeqListNode* seqList_delete(SeqList* list, int pos) {
if (list == NULL || pos<0)
{
return NULL;
}
int i = 0;
ArrayList *arrayList = NULL;
SeqListNode *node = 0;
arrayList = (ArrayList*)list;
node = (SeqListNode*)arrayList->node[pos];//缓存pos的位置
for (i = pos + 1; i < arrayList->length; i++) {
arrayList->node[i - 1] = arrayList->node[i];
}
arrayList->length--;
return node;
}
再来看看测试代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include<string.h>
#include "seqList.h"
typedef struct mac {
int pir;
char name[64];
}Mac;
void main() {
int i = 0;
Mac m1,m2,m3;
m1.pir = 3200;
strcpy(m1.name,"m1");
m2.pir = 3456;
strcpy(m2.name, "m2");
m3.pir = 1900;
strcpy(m3.name, "m3");
SeqList* list=seqList_create(10);
seqList_insert(list, &m1, 0);
seqList_insert(list,&m2, 0);
seqList_insert(list,&m3,0);
for ( i = 0; i <seqList_length(list); i++)
{
Mac* node=(Mac*)seqList_get(list,i);
printf("pir=%d\n", node->pir);
printf("name=%s\n", node->name);
}
//删掉一个元素
seqList_delete(list,0);
printf("---------------\n");
for (i = 0; i <seqList_length(list); i++)
{
Mac* node = (Mac*)seqList_get(list, i);
printf("pir=%d\n", node->pir);
printf("name=%s\n", node->name);
seqList_destory(list);
printf("helloWord\n");
system("pause");
}
再来看看C++的实现:
#pragma once
template<typename T>
class CircleList2
{
public:
CircleList2(int cap);
~CircleList2();
public:
T get(int pos);
int insert(T &t,int pos);
int dele(int pos);
int getLen();
private:
T *ts;
int len;
};
#include "CircleList2.h"
template<typename T>
CircleList2<T>::CircleList2(int cap)
{
ts = new T[cap];
this->len = 0;
}
template<typename T>
CircleList2<T>::~CircleList2()
{
delete[]ts;
ts = nullptr;
}
template<typename T>
T CircleList2<T>::get(int pos) {
return ts[pos];
}
template<typename T>
int CircleList2<T>::insert(T & t, int pos)
{
int i = 0;
for ( i = len; i <pos ; i--)
{
ts[i] = ts[i - 1];
}
ts[i] = t;
this->len++;
return 0;
}
template<typename T>
int CircleList2<T>::dele(int pos)
{
for (int i = len; i <pos ; i--)
{
ts[i] = ts[i + 1];
}
len--;
return 0;
}
template<typename T>
int CircleList2<T>::getLen()
{
return len;
}
测试文件:
#include<iostream>
using namespace std;
#include"CircleList2.cpp"
struct Teacher
{
int age;
};
void main() {
Teacher t1,t2;
t1.age = 12;
t2.age = 14;
CircleList2<Teacher> list(10);
list.insert(t1,0);
list.insert(t2, 0);
for (int i = 0; i < list.getLen(); i++)
{
Teacher t=list.get(i);
cout << "age==" << t .age<<endl;
}
cin.get();
}