顺序表习题C语言

本文深入探讨了顺序表的各种操作实现,包括初始化、创建、显示、删除最小元素、逆置、删除特定值元素、删除区间值元素及删除重复元素等。通过具体代码示例,详细解释了每种操作的算法原理和实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序表习题

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define LIST_INIT_SIZE 5

typedef int ElemType;
typedef struct
{
    ElemType *pbase;
    int length;
    int maxsize
}SqList;

void init(SqList *L);
void CreateList(SqList *L,ElemType *a,int n);
bool DeleteMin(SqList *L);
void ShowList(SqList *L);
void ReverseList(SqList *L);
void DeleteElem(SqList *L,ElemType x);
void DeleteElem2(SqList *L,ElemType x);
bool DeleteElems(SqList *L,ElemType s,ElemType t);
bool DeleteSqElems(SqList *L,ElemType s,ElemType t);
bool DeleteSqElems2(SqList *L,ElemType s,ElemType t);
void DeleteRepeat(SqList *L);

int main()
{
    SqList L;
    ElemType min;
    init(&L);
    ElemType a[] = {1,1,2,2,2,3,3,3,4,4,5};
    CreateList(&L,a,11);
    ShowList(&L);
    DeleteRepeat(&L);
    ShowList(&L);
}

void init(SqList *L)
{
    L->length = 0;
    L->maxsize = LIST_INIT_SIZE;
    L->pbase = (ElemType *)malloc(sizeof(ElemType)*L->maxsize);
    if(!L->pbase)
    {
        printf("malloc fail");
        exit(0);
    }
}

void CreateList(SqList *L,ElemType *a,int n)
{
    int i;
    for(i = 0; i<n; i++)
        L->pbase[i] = a[i];
    L->length = n;
}

void ShowList(SqList *L)
{
    int i;
    for(i = 0; i<L->length; i++)
        printf("%d",L->pbase[i]);
    printf("\n");
}
/* ex2.1 删除最小元素*/
bool DeleteMin(SqList *L)
{
    if(L->length == 0)
        return false;
    ElemType min = L->pbase[0];
    int i,pos = 0;
    for(i = 1; i < L->length; i++)
    {
        if(L->pbase[i]<min)
        {
            min = L->pbase[i];
            pos = i;
        }
    }
    L->pbase[pos] = L->pbase[L->length-1];
    L->length = L->length-1;
    return true;
}
/* ex2.2 逆置顺序表*/
void ReverseList(SqList *L)
{
    int i,j;
    ElemType temp;

    i = 0;
    j = L->length-1;

    for(; i<(L->length)/2;i++,j--)
    {
        temp = L->pbase[j];
        L->pbase[j] = L->pbase[i];
        L->pbase[i] = temp;
    }
}

/* ex2.3 删除所有值为x的元素 法一*/
void DeleteElem(SqList *L,ElemType x)
{
    int i, k;

    k = 0; //k:不等于x的元素个数

   for(i = 0; i<L->length; i++)
   {
       if(L->pbase[i] != x)
       {
           L->pbase[k] = L->pbase[i];
           k++;
       }
   }
   L->length = k;
}

/* ex2.3 删除所有值为x的元素
    法二:i,j从两端遍历,如果左端元素等于x,右端元素不等于x,则把右端元素移动到左端*/
void DeleteElem2(SqList *L,ElemType x)
{
  int i,j;
  i = 0;
  j = L->length-1;

  while(i<=j)
  {

      if(L->pbase[i] == x)
      {
          if(L->pbase[j]!=x)
          {
            L->pbase[i] = L->pbase[j];
            j--;
            i++;
          }
          else
            j--;
        L->length--;
      }
      else
            i++;
  }
}

/* ex2.4 删除有序表中值位于s和t之间的元素 */
bool DeleteElems(SqList *L,ElemType s,ElemType t)
{
    if(s>=t || L->length == 0)
        return false;
    int i,k;
    k = 0;

    for(i = 0; i<L->length; i++)
    {
        if(L->pbase[i] <= s)
            {
                k++;
            }
        else if(L->pbase[i] >= t)
        {
            L->pbase[k] = L->pbase[i];
            k++;
        }
    }
    L->length = k;
    return true;
}

/* ex2.5 删除顺序表中值位于s和t之间的元素
   法一顺序表次序会改变*/
bool DeleteSqElems(SqList *L,ElemType s,ElemType t)
{
    if(s>=t || L->length == 0)
        return false;

    int i,j;
    i = 0;
    j = L->length-1;

    while(i<=j)
    {
        if(L->pbase[i]>=s && L->pbase[i]<=t)
        {
            if(L->pbase[j]<s || L->pbase[j]>t)
            {
                L->pbase[i] = L->pbase[j];
                i++;
            }
            j--;
            L->length--;
        }
        else
            i++;
    }
    return true;

}

/* ex2.5 删除顺序表中值位于s和t之间的元素
   法二顺序表次序不会改变 记录位于s和t之间的元素个数,前移k个元素*/

bool DeleteSqElems2(SqList *L,ElemType s,ElemType t)
{
    if(s>=t || L->length == 0)
        return false;

    int i,k;
    k = 0;

    for(i = 0; i<L->length; i++)
        if(L->pbase[i]>=s && L->pbase[i]<=t)
            k++;
        else
            L->pbase[i-k] = L->pbase[i];
    L->length -=k;
    return true;
}

/*ex2.6 删除有序顺序表中所有重复的元素*/
void DeleteRepeat(SqList *L)
{
    int i,k; //i遍历顺序表,k存储第一个不同的元素的位置
    k = 0;

    for(i = 1; i<L->length; i++)
    {
        if(L->pbase[i] != L->pbase[k])
        {
            k++;
            L->pbase[k] = L->pbase[i];
        }
    }
    L->length = k+1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值