创建头文件Seqlist.h
#pragma once//防止头文件被重复引用
#define INIT_SIZE 10
typedef struct DSeqList
{
int *elem;//指向动态创建的内存,用于存储数据
int length;//有效数据个数
int listsize;//总容量(总格子数)
}DSeqList,*PDSeqList;
//初始化
void InitSeqList(PDSeqList plist);
//获取数据长度
int GetLength(PDSeqList plist);
//往pos位置插入数据val
bool Insert(PDSeqList plist,int val,int pos);
//获取pos位置的值
int GetElem(PDSeqList plist,int pos);
//查找关键字key,找到后返回下标,失败返回-1
int Search(PDSeqList plist,int key);
//删除plist中的第一个key
bool DeleteVal(PDSeqList plist,int key);
//删除plist中pos位置的值
bool DeletePos(PDSeqList plist,int pos);
//将pos位置的值赋值成newValue值
bool SetPos(PDSeqList plist,int pos,int newVal);
//显示
void Show(PDSeqList plist);
//清空数据
void Clear(PDSeqList plist);
//销毁动态内存
void Destroy(PDSeqList plist);
创建Seqlist.cpp文件
#include"Seqlist.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//判空
static void DeterNULL(PDSeqList plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
exit(0);
}
}
//判满
static bool IsFull(PDSeqList plist)
{
return plist->length==plist->listsize;
}
//将原来的内存扩大2倍
static bool Inc(PDSeqList plist)
{
plist->elem=(int *)realloc(plist->elem,plist->listsize*2*sizeof(int));
//plist->length不变
plist->listsize*=2;
return true;
}
//初始化
void InitSeqList(PDSeqList plist)
{
DeterNULL(plist);
plist->elem=(int *)malloc(INIT_SIZE*sizeof(int));
plist->length=0;
plist->listsize=INIT_SIZE;
}
//获取数据长度
int GetLength(PDSeqList plist)
{
DeterNULL(plist);
return plist->length;
}
//往pos位置插入数据val
bool Insert(PDSeqList plist,int val,int pos)
{
DeterNULL(plist);
if(pos<0 || pos>plist->length)
{
return false;
}
if(IsFull(plist))
{
Inc(plist);
}
//往后移数据
for(int i=plist->length-1;i>=pos;i--)
{
plist->elem[i+1]=plist->elem[i];
}
//插入新数据
plist->elem[pos]=val;
//有效长度+1
plist->length++;
return true;
}
//获取pos位置的值
int GetElem(PDSeqList plist,int pos)
{
DeterNULL(plist);
return plist->elem[pos];
}
//查找关键字key,找到后返回下标,失败返回-1
int Search(PDSeqList plist,int key)
{
DeterNULL(plist);
for(int i=0;i<plist->length;i++)
{
if(plist->elem[i]==key)
{
return i;
}
}
return -1;
}
//删除plist中的第一个key
bool DeleteVal(PDSeqList plist,int key)
{
DeterNULL(plist);
int index=Search(plist,key);
DeletePos(plist,index);
return true;
}
//删除plist中pos位置的值
bool DeletePos(PDSeqList plist,int pos)
{
DeterNULL(plist);
if(pos<0 || pos>=plist->length)
{
return false;
}
for(int i=pos;i<plist->length-1;i++)
{
plist->elem[i]=plist->elem[i+1];
}
plist->length--;
return true;
}
//将pos位置的值赋值成newValue值
bool SetPos(PDSeqList plist,int pos,int newVal)
{
DeterNULL(plist);
if(pos<0 || pos>plist->length)
{
return false;
}
plist->elem[pos]=newVal;
return true;
}
//显示
void Show(PDSeqList plist)
{
for(int i=0;i<plist->length;i++)
{
printf("%d ",plist->elem[i]);
}
printf("\n");
}
//清空数据
void Clear(PDSeqList plist)
{
DeterNULL(plist);
plist->length=plist->listsize=0;
}
//销毁动态内存
void Destroy(PDSeqList plist)
{
DeterNULL(plist);
free(plist->elem);
plist->elem=NULL;
plist->length=plist->listsize=0;
}
相关实现总结
1.设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性
bool InsertX(PDSeqList va,int x)
{
//找到插入的位置,找到第一个大于x的值,没有就结尾
int i;
for(i=0;i<GetLength(va);i++)
{
if(va->elem[i]>x)
{
break;
}
}
return Insert(va,x,i);
}
2.比较两个顺序表的大小
int Cmp(PDSeqList plistA,PDSeqList plistB)
{
for(int i=0;i<GetLength(plistA) && i<GetLength(plistB);i++)
{
int tmp=plistA->elem[i]-plistB->elem[i];
if(tmp!=0)
{
return tmp;
}
}
return GetLength(plistA)-GetLength(plistB);
}
3.顺序表逆置
void Reverse(PDSeqList plist)
{
int i=0;
int j=GetLength(plist)-1;
int tmp;
while(i<j)
{
tmp=plist->elem[i];
plist->elem[i]=plist->elem[j];
plist->elem[j]=tmp;
i++;
j--;
}
}
4.A,B,C升序排列,对A表如下操作:删除既在B中出现,又在C中出现的元素
void Sub(PDSeqList plistA,PDSeqList plistB,PDSeqList plistC)
{
int i=0;//plistA的下标
int j=0;//plistB的下标
int k=0;//plistC的下标
while(i<GetLength(plistA)&&j<GetLength(plistB) && k<GetLength(plistC))
{
if(plistA->elem[i]==plistB->elem[j] && plistA->elem[i]==plistC->elem[k])
{
DeletePos(plistA,i);
}
else if(plistA->elem[i]<plistB->elem[j])
{
i++;
}
else if(plistA->elem[i]>plistB->elem[j])
{
j++;
}
else if(plistA->elem[i]<plistC->elem[k])
{
i++;
}
else
{
k++;
}
}
}
5.两个顺序表有序,执行C=A并B,算法时间复杂度要求为O(n+m)(A,B只允许遍历一遍)
void Union(PDSeqList plistA,PDSeqList plistB,PDSeqList plistC)
{
int i=0;//plistA的下标
int j=0;//plistB的下标
int k=0;//plistC的下标
while(i<GetLength(plistA)&&j<GetLength(plistB))//两个均还有数据
{
if(plistA->elem[i]<plistB->elem[j])
{
//plistC->elem[k++]=plistA->elem[i++];//error
Insert(plistC,plistA->elem[i],k);
k++;
i++;
}
else if(plistA->elem[i]>plistB->elem[j])
{
Insert(plistC,plistB->elem[j],k);
k++;
j++;
}
else
{
Insert(plistC,plistA->elem[i],k);
k++;
i++;
j++;
}
}
//一个还有数据,另一个没有数据了
while(i<GetLength(plistA))
{
Insert(plistC,plistA->elem[i],k);
k++;
i++;
}
while(i<GetLength(plistB))
{
Insert(plistC,plistB->elem[j],k);
k++;
j++;
}
}