数据结构 02 顺序线性表汇总

#include <stdio.h>
#include <stdlib.h>

/*此处是顺序线性表数据结构定义*/
typedef int DataType;
struct seqList
{//有3个数据成员
  int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM   
  int curNum;//用于存放顺序线性表中数据元素的个数  整型  curNum
  DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址  
};

typedef struct seqList *PseqList;

PseqList createNullList_seq(int m)
{//此处填写代码,创建一个空的顺序线性表,能存放的最大元素个数为 m
 //若m=0,则返回NULL 
    PseqList L ;
    L = (PseqList)malloc(sizeof(struct seqList));
    if (m==0)
        return NULL;

    if (L!=NULL)
    {
        L->element = (DataType*)malloc(m*sizeof(DataType));
        if (L->element != NULL)
        {
            L->curNum = 0;
            L->MAXNUM = m;
            return L; 
        }
        else
            return NULL;       
    }
    else
        return NULL;  
}


int isFullList_seq(PseqList L)
{
  //判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
    if (L->curNum < L->MAXNUM)
        return 0;
    else
        return 1;
}


int insertP_seq(PseqList L , int p ,int x)
{// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
   //如果线性表满了, 还需输"list is full"的提示
  //如果插入位置非法,需输出提示"position is illegel" 

    if (p < 0 || p > L->MAXNUM-1){
        printf("position is illegel");  
        return 0;      
    }


    else if(isFullList_seq(L)){
        printf("list is full");  
        return 0;      
    }

    else{
        for(int i = L->curNum ; i > p ; i-- ){
            L->element[i] = L->element[i-1];
        }
        L->element[p] = x;
        return 1;
    }

}

int insertPre_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    insertP_seq(L,p-1,x);
}

int insertPost_seq(PseqList L , int p ,int x)
{
 // 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可    
    insertP_seq(L,p+1,x);    
}

void printList_seq(PseqList L)
{//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
    for (int i = 0; i < L->curNum; i++)
    {
        printf("%d ",L->element[i]);
    }    
}


int destroyList_seq(PseqList L)
{
    //返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
    if (L->element == NULL)
        return 0;
    else{
        int num = L->curNum;
        free(L->element);
        return num;
    }
    
}


int locate_seq(PseqList L,int x)
{//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
    
    int num = -1 ;
    int flag = 0; 
    for (int i = 0; i < L->curNum; i++)
    {
        if (L->element[i] == x)
        {
            num = i;
            flag = 1;
        } 
        if(flag == 1)
            break;       
    }
    return num;    
}

DataType locatePos_seq(PseqList L,int pos)
{// 在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
    if (pos < 0 || pos > L->curNum-1)
        return L->element[0];
    else
        return L->element[pos];    
}


int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
    int num = 1;
    if (pos < 0 || pos > (L->curNum-1))
        num = -1;
    else{
        for (int i = pos; i < L->curNum; i++)
        {
           L->element[i] = L->element[i+1];
        } 
        L->curNum--;       
    }    
    return num;
}

int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
  //可以使用之前已完成的操作
    int num = 0;
    while (1)
    {
        int pos = locate_seq(L,x);
        if(pos==-1)
            break;
        else{
            num++;
            deletePos_seq(L,pos);
        }
    }
    return num;  
}


void replace_seq(PseqList L,int x,int y)
{//将顺序表L中值为x的数据元素替换为y
    for (int i = 0; i < L->curNum; i++)
    {
        if (L->element[i] == x)
        {
            L->element[i] = y;
        }
        
    }
    
}

void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
  //使用常规删除即可,已修改测试用例
    int number = L->curNum;
    for (int i = 0; i < number-2; i++)
    {
        int flag = 0;
        for (int j = i+1; j < number-1; j++){
            if(L->element[i] == L->element[j]){
                flag = 1;
                deletePos_seq(L,j);
            }
        }

        if (flag == 1)
            deletePos_seq(L,i);
        
    }
}


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值