顺序线性表
顺序线性表数据结构定义
/*此处是顺序线性表数据结构定义*/
typedef int DataType;
struct seqList
{//有3个数据成员
int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM
int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum
DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
};
typedef struct seqList *PseqList;
创建空的顺序线性表,能存放的最大元素个数为m
/*创建空的顺序线性表,能存放的最大元素个数为 m*/
PseqList createNullList_seq(int m)
{ //若m=0,则返回NULL
PseqList plist = (struct seqList *)malloc(sizeof(struct seqList));
if(plist == NULL) return NULL; //分配空间失败
if(m==0)
{
return NULL;
}
plist->MAXNUM = m ;
plist->curNum = 0;
plist->element = (DataType *)malloc(sizeof(DataType)*m);
return plist;
}
在线性表表尾插入数据元素,返回值0表示插入失败,返回值1表示在表尾插入成功
int insertP_tail(PseqList plist , int x)
{
if(plist->curNum == plist->MAXNUM) //若表满,则无法插入
{
printf("list if full !");
return 0;
}
plist->element[plist->curNum] = x ;
plist->curNum++;
return 1;
}
回收线性表占用的空间
/*回收线性表占用的空间*/
int destroyList_seq(PseqList plist)
{
//返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
if(plist == NULL) return 0;
int m = plist->curNum;
free(plist->element);
free(plist);
return m;
}
输出线性表的元素
void printList_seq(PseqList plist)
{//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
for(int i=0;i<plist->curNum;i++)
printf("%d ",plist->element[i]);
}
求顺序线性表中连续子表(最少有一个元素)的最大和并输出
问题描述:输入若干个整型数据(可能有正数和负数),存放在顺序表中,求顺序表中连续子表(最少有一个元素)的最大和。
int seqMaxSum(PseqList plist)
{
int sum,max;
sum=max=plist->element[0];//先让sum和max为同一个值
int i;
for(i=1;i<plist->curNum;i++)
{
if(sum<0)//当前面的元素都是负数的时候,就没必要相加
{//负数相加只会更小
sum=plist->element[i];
}
else if(sum>=0)
{
sum+=plist->element[i];
}
if(sum>max)
{
max=sum;
}
}
return max;
}
寻找缺失最小正整数的算法
寻找线性表中没有出现的最小的正整数
int findMinNumber(PseqList plist)
{
//若线性表为空,则返回0
if(plist->curNum==0)
{
return 0;
}
int i;
for(i=0;i<plist->curNum;i++)
{
//plist->element[i]>=1&&plist->element[i]<=plist->curNum这个表示这个最小正整数在1~curNUM范围
//plist->element[i]!=i+1表示当这个顺序线性表的下标与下标+1不相等时
//plist->element[plist->element[i]-1]!=plist->element[i]表示:
//当这两个不一样的时候,将plist->element[i]放到正确的位置
//例如:一共4个数,plist->element[0]=3,plist->element[1]=4,plist->element[3]=-1,plist->element[4]=0
//当i=0时,plist->element[0]不等于1,并且plist->element[0]=3 与 plist->element[plist->elemen[0]-1]=plist->element[3]=-1不相等
//相当于将数值放到对应的位置
//然后交换位置
while(plist->element[i]!=i+1&&plist->element[i]>=1&&plist->element[i]<=plist->curNum&&plist->element[plist->element[i]-1]!=plist->element[i])
{
int temp;
temp=plist->element[plist->element[i]-1];
plist->element[plist->element[i]-1]=plist->element[i];
plist->element[i]=temp;
}
}
for(i=0;i<plist->curNum;i++)
{
//第一个位置不对应的就是我们想要的结果
if(plist->element[i]!=i+1)
{
return i+1;
}
}
//如果元素都对上下标+1,那么就原来的个数+1
return plist->curNum+1;
}
找出给定目标值target在有序线性表中出现的起始位置和结束位置
void findPos(PseqList plist,int target, int *pos)
{
if(plist==NULL)//如果plist是空的顺序线性表,则返回0
{
return 0;
}
int i;
int count=0;//做一个目标值结束的标志
for(i=0;i<plist->curNum;i++)
{
if(count==0&&plist->element[i]==target)
{
pos[0]=i;
count++;
}
else if(count!=0&&plist->element[i]==target)
{
pos[1]=count;
count++;
}
}
if(count==0)//如果数组中不存在目标值,返回-1, -1。
{
pos[0]=pos[1]=-1;
}
if(count==1)
{
pos[1]=pos[0];
}
return;
}
主函数
int main()
{
int num , data ;
int pos[2];
printf("请输入元素的个数\n");
scanf("%d",&num);
PseqList plist = createNullList_seq(num);
printf("请输入%d个元素\n",num);
for(int i=0;i<num;i++)
{
scanf("%d",&data);
insertP_tail( plist ,data);
}
printf("%d",seqMaxSum(plist));//顺序线性表中连续子表(最少有一个元素)的最大和并输出
printf("%d",findMinNumber(plist));//寻找线性表中没有出现的最小的正整数
printf("请输入待查找的元素:\n");
scanf("%d",&data);
findPos(plist,data,pos);
printf("%d的起始位置和终止位置:\n",data);
printf("%d %d",pos[0],pos[1]);
}