《数据结构》 顺序表常用操作代码集合

时间:2022-04-26
本文章向大家介绍《数据结构》 顺序表常用操作代码集合,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Ps:每段代码中,添加了署名Solo的是博主自己写的,其余来自课本或者老师。

//定义线性表的存储结构
#define MAXSIZE 100
typedef struct
{
    ElemType elem[MAXSIZE]; //ElemType自定义
    int last;
} SeqList;
//线性表按查找内容运算 Locate(L,e)函数
int Locate(SeqList L, ElemType e)
{
    i = 0;

    while((i <= L.last) && (L.elem[i] != e))
        i++;
    if(i <= L.last)    return(i + 1);
    else    return(-1);
}
//线性表的插入操作
#define OK 1
#define ERROR 0
int InList(Seqlist *L, int i, ElemType e)
{
    int k;
    if(i < 1 || i > L->last+2) 
        {   
            printf("插入位置i不合法");
            return ERROR;
        }

    if(L->last >= MAXSIZE - 1)
        {
            printf("表已满,无法插入");
            return ERROR;
        }
     for(k = L->last; k >= i-1; k--)
        L->elem[k+1] = L->elem[k];

     L->elem[i-1] = e;
     L->last++;
     return OK; 
}
//线性表的删除操作
int DelList(SeqList *L, int i, ElemType *e)
{
    int k;
    if(i < 1 || i > L->last+1)
        {
            printf("删除位置不合法");
            return ERROR;
        }
    *e = L->elem[i-1];
    for(k = i; i <= L->last; k++)
        L->elem[k-1] = elem[k];
        L->last--;

     return OK;
}
//线性表原地逆置
int SListRev(SeqList *L)
{
    int i;
    ElemType t;
    for(i=0; i<L->last/2; i++)
        {
            t = a[i]; a[i] = a[n-i-1]; a[n-i-1] = t;
        }
    return Ok;
}
//线性表的合并运算1
void mergeList(SeqList *LA, Seqlist *LB, Seqlist *LC)
{
    int i,j,k;
    i=0; j=0; k=0;

    while(i <= LA->last && j <= LB->last)
    if(LA->elem[i] <= LB->elem[j])
        {
            LC->elem[k] = LA->elem[i];
            i++; k++;
        }
    else{
            LC->elem[k] = LB->elem[i];
            j++; k++; 
        }
    while(i <= LA->last)
        {
            LC->elem[k] = LA->elem[i];
            i++; k++;
        }
    while(j <= LB->last)
        {
            LC->elem[k] = LA->elem[j];
            j++; k++;
        }

     LC->last = LA->last + LB->last + 1;
}
//线性表的合并运算2——Solo
void mergeList(SeqList *LA, Seqlist *LB, Seqlist *LC)
{
    int i,j,k;
    i=0; j=0; k=0;

    while(i <= LA->last || j <= LB->last)
    if(LA->elem[i] <= LB->elem[i] || (i <= LA->last && j > LB->last  )
        {
            LC->elem[k] = LA->elem[i];
            i++; k++;
        }

    if(LA->elem[i] > LB->elem[j] || (i > LA->last && j <= LB->last))
        {
            LC->elem[k] = LB->elem[i];
            j++; k++; 
        }
}
/*删除非递减顺序表L中所有值相等元素——Solo*/
//①若相等的值只有一个,为e,只有该种情况才能满足《数据结构》课本习题的要求
void Delsame(Seqlist *L e)
{   
    int i,j;
    for(i=0,j=0; i<L->last; i++)
        if(L->elem[i] != e)     { L->elem[j] = L->elem[i]; j++; }
    L->last = j+1;
}
//②若相等的值有很多,且不确定 两种方法
void Delmulsame(Seqlist *L)
{
    int i,j,k;

    for(i=0; i<L->last; i++)
       for(j=1; j<L->last; j++)
          {
              if(L->elem[i] = L->elem[j])
                 for(k=j; j<L->last; k++)
                    {
                        L->elem[k] = L->elem[k+1];
                        L->last--;
                    }
          }
}
void Delmulsame(Seqlist *L)
{
    int i,j,k,t;
    for(i=0; i<L->last-1; i++)
        {
            for(k=i, j=i+1; j<n; j--)   //冒泡法排序
                if(a[j] <a[k])  k = j;
            if(k != i)
                { t = a[i]; a[i] = a[k]; a[k] = t; }
        }
/*  for(i=0; i<L->last-1; i++)         //这段被注释掉了,是选择法排序
        for(j=L-last-1; j>=i; j--)
            if(a[j] > a[j+1])
               { a[j] = t; a[j] = a[j+1]; a[j+1] = a[j]; }   */
    for(i=0; i<L->last; i++)
        {
            if(L->elem[i] = L->elem[i+1])
               {
                   for(k=i; k<L->last; k++)
                   {
                       L->elem[k] = L->elem[k+1];
                       k--;
                       L->last--;
                   }
               }
        }
}

zhihu:Solo | weibo@从流域到海域