顺序线性表

顺序线性表

顺序线性表数据结构定义

/*此处是顺序线性表数据结构定义*/
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]);
}
  • 24
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值