数据结构集合:
1.线性结构
2.树形结构
3.集合
4.图
5.排序
线性表:
1.顺序表(顺序结构存储):逻辑相邻,物理也相邻
2.链表(链式结构存储):逻辑相邻,物理不一定相邻
不定长的顺序表:
不定长的顺序表就是顺序表的长度不确定,从而使用动态内存的创建使得顺序表扩大容量
代码:
头文件 dseqlist.h
#pragma once
//不定长顺序表
typedef struct
{
int *elem;//指向动态内存的指针
int length;//有效数据个数
int listsize;//总单元个数
}DSeqList,*PDSeqList;
#define INITSIZE 10 //初始化大小
void InitDSeqList(PDSeqList ps);
//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos);
bool Insert_begin(PDSeqList ps,int val);
bool Insert_end(PDSeqList ps,int val);
//查找ps中第一个key的下标
int Search(PDSeqList ps,int key);
//删除ps中的第一个key
bool Delete(PDSeqList ps,int key);
//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos);
bool IsEmpty(PDSeqList ps);
//清空数据
void Clear(PDSeqList ps);
//销毁整个结构
void Destroy(PDSeqList ps);
int GetLength(PDSeqList ps);
void Show(PDSeqList ps);
源文件 dseqlist.cpp
#include <stdio.h>
#include <stdlib.h>
#inlcude <assert.h>
#include "dseqlist.h"
//初始化顺序表
void InitDSeqList(PDSeqList ps);
{
assert(ps!=NULL);
ps->elem=(int*)malloc(INITSIZE*sizeof(int));
ps->length=0;
ps->listsize=INITSIZE;
}
//内部函数判满
static bool IsFull(PDSeqList ps)
{
return ps->length == ps->listsize;
}
//将ps的容量扩大到原来的2倍
static void Inc(PDSeqList ps)
{
ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
ps->listsize *= 2;
}
//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos);//O(n)
{
if(pos<0||pos>ps->length)
{
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++;
}
//头插
bool Insert_begin(PDSeqList ps,int val);
{
Insert(ps,val,0);
}
//尾插
bool Insert_end(PDSeqList ps,int val);
{
Insert(ps,val,ps->length);
}
//查找ps中第一个key的下标
int Search(PDSeqList ps,int key);
{
for(int i=0;i<ps->length;i++)
{
if(ps->elem[i]==key)
return i;
}
return -1;
}
//删除ps中的第一个key
bool Delete(PDSeqList ps,int key);
{
int index=Search(ps,key);
return DeletePos(ps,index);
}
//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos);
{
if(pos<0||pos>=ps->length)
{
return false;
}
for(int i=0;i<ps->length-1;i++)
{
ps->elem[i]=ps->elem[i+1];
}
ps->length--;
return true;
}
//判断是否为空
bool IsEmpty(PDSeqList ps);
{
return ps->length==0;
}
//清空数据
void Clear(PDSeqList ps);
{
ps->length=0;//ps->length == (*ps).length
}
//销毁整个结构
void Destroy(PDSeqList ps);
{
free(ps->elem);
ps->elem=NULL;
ps->length=0;
ps->listsize=0;
}
//返回有效数据个数
int GetLength(PDSeqList ps);
{
return ps->length;
}
//显示数据
void Show(PDSeqList ps);
{
for(int i=0;i<ps->length;i++)
{
printf("%d",ps->elem[i];
}
printf("\n");
}
主函数 test.cpp
#include "dseqlist.h"
#include <vld.h>
int main()
{
DSeqList ds;
InitDSeqList(&ds);
for(int i=0;i<15;i++)
{
Insert(&ds,i,i);
}
Delete(&ds,10);
Show(&ds);
Clear(&ds);
Show(&ds);
Destroy(&ds);
return 0;
}