不定长顺序表和定长顺序表在很多地方都是一样的,只不过采用了动态分配的方式处理数据。具体代码如下:
头文件 desqlist.h
#pragma once
//不定长顺序表
#define INIT_SIZE 10 //初始化单元数量
typedef struct DSeqList
{
int *elem;//指向存储数据的内存
int length;//有效数据个数
int listsize;//总格子数(开辟的总单元个数)
}DSeqList,*PDSeqList;
void InitDSeqList(PDSeqList ps);//SeqList *ps
bool Insert(PDSeqList ps,int pos,int val);
bool IsEmpty(PDSeqList ps);
//rtval输出参数
bool Delete(PDSeqList ps,int pos,int *rtval);
bool GetElem(PDSeqList ps,int pos,int *rtval);
bool SetElem(PDSeqList ps,int pos,int newval);
int Search(PDSeqList ps,int key);
void Show(PDSeqList ps);
void Destroy(PDSeqList ps);
void Clear(PDSeqList ps);
//获取有效数据的个数
int GetLength(PDSeqList ps);
void Merge(PDSeqList a,PDSeqList b); //A=AUB
void Nerge(PDSeqList a,PDSeqList b);// A=AnB
具体实现 Desqlist.cpp文件
#include"seqlist.h"
#include<stdio.h>
#include<assert.h>
void InitSeqList(PSeqList ps)//初始化
{
assert(ps != NULL);
if(ps == NULL)
{
return ;
}
ps->length = 0;
}
static bool IsFull(PSeqList ps)//内部判满
{
return ps->length == NUM;
}
bool Insert(PSeqList ps,int pos,int val)//插入
{
assert(ps != NULL);
if(ps == NULL || pos>ps->length || pos<0 || IsFull(ps))//pos>ps->length 是因为插入时可以直接插入在顺序表的最后面
{
return false;
}
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(PSeqList ps)//判空
{
return ps->length == 0;
}
//rtval输出参数
bool Delete(PSeqList ps,int pos,int *rtval)//删除
{
assert(ps != NULL);
if(ps == NULL || pos>=ps->length || pos<0)
{
return false;
}
if(rtval!=NULL)
{
*rtval=ps->elem[pos];
}
for(int i = pos;i<ps->length;i++)
{
ps->elem[i]=ps->elem[i+1];
}
ps->length--;
return true;
}
bool GetElem(PSeqList ps,int pos,int *rtval)//得到某位元素
{
assert(ps != NULL);
if(ps == NULL || pos>ps->length || pos<0)
{
return false;
}
*rtval=ps->elem[pos];
return true;
}
bool SetElem(PSeqList ps,int pos,int newval)//改变某位元素
{
assert(ps != NULL);
if(ps == NULL || pos>=ps->length || pos<0)
{
return false;
}
ps->elem[pos]=newval;
return true;
}
int Search(PSeqList ps,int key)//查找
{
assert(ps != NULL);
if(ps == NULL)
{
return -1;
}
for(int i = 0;i<ps->length;i++)
{
if(ps->elem[i] = key)
{
return i;
}
}
return -1;
}
int GetLength(PSeqList ps)//获取有效数据的个数
{
return ps->length;
}
void Show(PSeqList ps)//打印
{
assert(ps != NULL);
if(ps == NULL)
{
return ;
}
for(int i = 0;i<ps->length;i++)
{
printf("%d ",ps->elem[i]);
}
printf("\n");
}
void Destroy(PSeqList ps)//销毁
{
Clear(ps);
}
void Clear(PSeqList ps)//清除
{
ps->length = 0;
}
test.cpp
int main()
{
DSeqList a;
InitDSeqList(&a);
for(int i=0;i<4;i++)
{
Insert(&a,i,i);
}
Show(&a);
DSeqList b;
InitDSeqList(&b);
for(int i=0;i<5;i++)
{
Insert(&b,i,i);
}
Show(&b);
//Merge(&a,&b);
//Show(&a);
Nerge(&a,&b);
Show(&a);
Clear(&a);
Destroy(&a);
Clear(&b);
Destroy(&b);
}