数据结构C语言,顺序表基本函数(不定时补充新算法)

本文详细介绍了使用C语言实现线性表(顺序表)的各种操作,包括创建、初始化、销毁、判断空、获取长度、显示元素、获取指定位置元素、查找元素位置、插入元素、删除元素等。此外,还提供了两种快速排序的实现方法,一种以第一个元素为基准,另一种针对奇偶数的排序。这些操作和算法是数据结构和算法学习的基础内容。
摘要由CSDN通过智能技术生成

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType;

typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;

void CreateList(SqList *&L,ElemType a[],int n)
{
  int i=0,k=0;
  L=(SqList *)malloc(sizeof(SqList));       //k作为表长计数,i作为顺序表位置标志,n是表的最大元素值
  while(i>n)
  {
  L->data[i]=a[i];
  k++,i++;
  }
  L->length=k;
}

void InitList(SqList *&L)
{
  L=(SqList *L)malloc(sizeof(SqList));//初始化把表长置为0
  L->length=0;
}

void DestoryList(&L)
{
    free(L);//C语言中用L释放该地址的内存
}

bool ListEmpty(SqList *L)
{
    return(L->length==0);//判断长度是否为空
}

int ListLength(SqList *L)//判断表长,*取内容,获得了结构体内的length数据
{
    return(L->length);
}

void DispList(SqList *L)//输出线性表
{
    for(int i=0;i<L->length;i++)
    {
        printf("%d",L->data[i]);
    }
    printf("\n");
}

bool GetElem(SqList *L,int i,ElemType &e)//求线性表某个数据的值
{
    if(i<1||i>L->length)//先判断符合条件的e,不符合直接返回
        return false;
    e=L->data[i-1];//数组和真实位置差一个单位距离
    return true;//返回数值
}

int LocateElem(L,e)//在L中找有没有和e相等的元素
{
    int i=0;
    while(i<L->length&&L->data[i]!=e)
        i++;
    if(i>L->length)
    {
        return 0;     //大于表长也找不到
    }else
    {
        return i+1;   //返回逻辑序号
    }
}

bool ListInsert(SqList*&L,int i,ElemType e)//顺序表的定点插入
{
    int j;
    if(i<1||i>L->length+1)//盘错条件
        return false;
    i--;//换成物理信号
    for(j=L->length;j>i;j--)//初始j在最后位置
        L->data[j]=L->data[j-1];
    L->data[i]=e;
    L->length++;
    return true;//回复:返回成果标志
}

bool ListDelete(SqList *&L,int i,&e)
{
    int j;
    if(i<1||i>SqList->length)
         return false;
    i--;
    e=L->data[i];
    for(j=i;j<L->length-1;j++)
        L->data[j]=L->data[j+1];
    L->length--;
    return true;

}

void delnode1(SqList *&L,ElemType x)
{
    int k=0,i;
    for(i=0;i<L->length;i++)
    {
        if(L->data[i]!=x)
        {
            L->data[i]=L->data[i];
            k++;
        }
    }
    L->length=k;
}

void delnode2(SqList *&L,ElemType x)
{
    int k=0,i=0;
    while(i<L->length)
    {
        if(L->data[i]==x)
        {
            k++;

        }else{
        L->data[i-k]=L->data[i];
        }
        i++;
    }
}

//设计一个算法,以第一个元素为基准,小于、等于它的放前面,大的放后面,顺序无要求

//解法一,pivot作为比较值,左i基准,以第一元素的值,左向右比;右j基准。右向左比。左边大于基准的和右边小于基准的交换,直到两者重合。
int partition1(SqList *&L)
{
    int i,j=L->length-1;
    ElemType pivot=L->data[0];
    while(i<j)
    {
        while(i<j&&L->data[j]>pivot)
            j--;
        while(i<j&&L->data[i]<=pivot)
            i++;
        if(i<j)
            swap(L->data[i],L->data[j]);
    }
    swap(L->data[0],L->data[i]);
}


//解法二,和第一个不同的就是移动的是左边大、右边小的数,别的没啥不同的。


//将所有奇数移到所有偶数前面,即上面的变式
//解法一

void move1(SqList *&L)
{
    int i=0,j=L->length-1;
    while(i<j)
    {
        while(i<j&&L->data[j]%2==0)//右向左,找奇数
            j--;
        while(i<j&&L->data[i]%2==1)//左向右,找偶数
            i++;
        if(i<j)
            swap(L->data[i],L->data[j]);
    }
}

//解法二,划定一个data[0...i]的区间放奇数,初始-1表示奇数区间为空。
//然后j从左向右扫描,交换,到右边完成
void move2(SqList *&L)
{

    int i=-1,j;
    for(j=0;j<=L->length-1;j++)
    {
        i++;
        if(L->data[j]%2==1)
        {
            i++;
            if(i!=j)
                swap(L->data[i],L->data[j]);

        }
    }
}

int main()
{

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值