天天看点

线性表—顺序存储(C语言)

//数组实现线性表(顺序表)
struct node
{
    ElemType data[MAXSIZE];    //存放线性表的数组
    int length;        //线性表的长度
};
typedef struct node SeqList;

//顺序表的初始化(置空)
void SeqListInit(SeqList L)
{
    L.length = ;
}

//顺序表的长度
int SeqListLength(SeqList L)
{
    return L.length;
}

//顺序表的取元素操作
ElemType SeqListGet(SeqList L, int i)
{
    if( (i>=) && (i<=L.length) )    //判断是否合法
        return L.data[i-];
    else
    {
        printf("i值不合法");
        exit();
    }
}
//exit(0)是一个库函数,它使程序立即正常终止。如果参数值为0,则认为是正常退出,如果参数值为非零,则认为是非正常退出,说明存在着执行错误。

//顺序表的定位操作
int SeqListLocation(SeqList L, ElemType e)
{
    int i =;
    while( (i<=L.length) && (e!=L.data[i-]) )
        i++;
    if(i<=L.length)
        return i;      //返回元素e在顺序表中的位置
    else
    {
        printf("此元素不在表中");
        return ;
    }
}

//顺序表的求前驱操作
ElemType SeqListPrior(SeqList L, ElemType e)
{
    int i = SeqListLocation(L,e);
    if(==i)  //先判断e是否为第一个元素
    {
        printf("第一个元素没有前驱");
        exit();
    }
    else
        return L.data[i-];
}

//顺序表的后继操作
ElemType SeqListLater(SeqList L, ElemType e)
{
    int i = SeqListLocation(L,e);
    if(L.length == i)
    {
        printf("最后一个元素没有后继");
        exit();
    }
    else
        return L.data[i];
}

//顺序表的前插操作
void SeqListInsert(SeqList L, int i, ElemType b)
{
    if(L.length == MAXSIZE)   //表满
    {
        printf("表已满,无法进行插入操作\n");
        exit();
    }
    if( (i<) || (i>L.length+) )   //i值不合适
    {
        printf("i值不合适\n");
        exit();
    }
    int j;
    for(j=L.length-; j>i-; j--)   //移出插入元素的位置
        L.data[j+] = L.data[j];
    L.data[i-] = b;
    L.length++;
}

//顺序表的删除操作
void SeqListDel(SeqList L, int i)
{
    if( (i<) || (i>L.length) )   //i值不合法
    {
        printf("i不合法");
        exit();
    }
    int j;
    for(j=i; j<=L.length-; j++)
        L.data[j-] = L.data[j];
    L.length--;
}

//顺序表的判空操作
bool SeqListEmpty(SeqList L)
{
    return !L.length;     //查看变量length的值是否为0,为0返回true,否则返回false
}

//顺序表的遍历操作
void SeqListTraverse(SeqList L)
{
    int i;
    if(SeqListEmpty(L))
        printf("只是一个空表");
    else
        for(i=; i<=L.length; i++)
            printf("%d", L.data[i-]);
}

//线性表的合并:直接合并,保存合并
//直接合并:将存在于线性表Lb但不存在于线性表La的元素插入La中
void SeqListUnion(SeqList La, SeqList Lb)
{
    int n,i;
    n = SeqListLength(La);
    for(i=; i<=SeqListLength(Lb); i++)
    {
        ElemType x = SeqListGet(Lb, i);
        if(SeqListLocation(La,x) == )
        {
            SeqListInsert(La, n+, x);
            n++;
        }
    }
}

//保存合并:两个都是有序的线性表,合并成一个新的线性表,新的线性表仍然是有序的
void SeqListMerge(SeqList La, SeqList Lb, SeqList Lc)
{
    SeqListInit(Lc);
    int i =; int j =; int k = ;
    while( (i<=SeqListLength(La)) && (j<=SeqListLength(Lb)) )
    {
        if( SeqListGet(La,i) <= SeqListGet(Lb,j) )
        {
            SeqListInsert(Lc, k+, SeqListGet(La,i));
            k++; i++;
        }
        else
        {
            SeqListInsert(Lc, k+, SeqListGet(Lb,j));
            k++; i++;
        }
    }
    while( i<=SeqListLength(La) )    //将La中剩余的元素插入到Lc中
    {
        SeqListInsert(Lc, k+, SeqListGet(La,i));
        k++; i++;
    }
    while( j<=SeqListLength(Lb) )    //将Lb中剩余的元素插入到Lc中
    {
        SeqListInsert(Lc, k+, SeqListGet(Lb,j));
        k++; j++;
    }
}
           

建立一个顺序表,用户通过输入个数和一组非递减顺序的数,即顺序表按照非递减顺序排列,对顺序表进行建立,删除指定位置的数,查找指定位置的数,插入一个数字功能。程序代码如下:

#include "stdio.h"
#include "stdlib.h"

#define listsize 100

typedef struct{
    int data[listsize];
    int length;
}Seqlist;

void main()
{
    void createlist(Seqlist *l,int n);
    void printlist(Seqlist *l,int n);
    void locateElem(Seqlist *l,int n);
    void listinsert(Seqlist *l,int i,int n);
    void listdelete(Seqlist *l,int i,int n);
    int n;

    int i=;
    Seqlist l;
    l.length=;

    printf("请输入线性表长度:");
    scanf("%d",&n);
    createlist(&l,n);
    printlist(&l,n);
    locateElem(&l,n);
    listinsert(&l,i,n);
    listdelete(&l,i,n);
    printf("\n");
}

//新建顺序表
void createlist(Seqlist *l,int n)
{
    int i;
    printf("请输入顺序表元素:\n");
    for(i=;i<n;i++)
    {
        scanf("%d",&l->data[i]);
        l->length=n;
    }
}

//输出顺序表
void printlist(Seqlist *l,int n)
{
    int i;
    printf("顺序表为:");
    for(i=;i<n;i++)
    {
        printf("%d ",l->data[i]);
    }
}

//查找元素
void locateElem(Seqlist *l,int n)
{
    int i=,*p;
    p=l->data;
    printf("\n请输入要查找的元素n:");
    scanf("%d",&n);
    while(i<=l->length&&(*p++!=n)) ++i;
    if(i<=l->length)
    printf("要查找的数的位置为:%d",i);
}

//插入元素
void listinsert(Seqlist *l,int i,int n)
{
    int *q,*p;
    printf("\n请输入要插入的数:");
    scanf("%d",&n);

    if(l->length==)
    {
        l->data[]=n;
        ++l->length;

    }
    q=&(l->data[]);
    while((*q<=n)&&(q<=&(l->data[l->length-])))
    {
        ++q;
    }
    ++l->length;
    for(p=&(l->data[l->length-]);p>=q;--p)
    {
    *(p+)=*p; 
    *p=n; 
    }

 printf("输出新表:\n");  
        for(i=;i<l->length;i++)
     {
        printf("%d ",l->data[i]);
     }
}

//删除元素
void listdelete(Seqlist *l,int i,int n)
{
    int *p,*q;
    printf("\n请输入要删除的数的位置:");
    scanf("%d",&i);   

    if(i<||i>l->length)
    printf("删除元素失败!");

    p=&l->data[i-];
    n=*p;
    q=l->data+l->length-;
    for(++p;p<=q;++p)
    {
         *(p-)=*p;
         --l->length;   

    }

    for(i=;i<l->length+;i++)
    {
        printf("%d ",l->data[i]);
    }
}
           

继续阅读