不定长顺序表插入、删除等相关操作

创建头文件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++;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值