SeqList 顺序表的实现

SeqList.h

#include "stdio.h"
#include "math.h"

//#define LISTSIZE 100
//typedef int DataType;

typedef struct {
    DataType list[LISTSIZE];
    int length;
}SeqList;

/******************************************************
C 语言中
结构体变量用         .   运算符来访问结构体的成员
指向结构体的指针用   ->  来访问其指向的结构体的成员
*******************************************************/


// 1  初始化顺序表,将顺序表的长度置为0
void InitList(SeqList *L) {
    L->length = 0;
}


// 2  判断顺序表是否为空,为空返回1,不空返回0
int ListEmpty(SeqList L) {
    if (L.length == 0)
        return 1;
    else
        return 0;
}


// 3  按序号查找操作
int GetElem(SeqList L,int i,DataType *e) {
    /*查找顺序表中第 i 个元素
      查找成功将该值返回给 e ,并返回 1 ;否则返回 -1 ,表示失败*/

    if (i<1 || i>L.length)   //查找之前判断序号是否合法
        return -1;
    *e = L.list[i - 1];      //将第 i 个元素赋值给 e
    return 1;
}


// 4  按内容查找操作
int LocateElem(SeqList L, DataType e) {
    /*查找顺序表中元素值为 e 的元素
      查找成功,将对应元素的序号返回;否则返回0,表示失败*/
    int i;
    for (i = 0; i < L.length; i++) 
    {
        if (L.list[i] == e)
            return i;           //返回的序号要搞清楚,从0开始
    }
    return 0;
}


// 5  插入操作
/*
插入                  i                  长度j     
序号  1   2   3   4   5   6   7   8   9   10

                   list[i-1]            list[j-1]   list[j]
list  0   1   2   3   4   5   6   7   8   9
*/
int InsertList(SeqList *L, int i, DataType e) 
{
    /*在顺序表的第 i 个位置插入 元素 e ,插入成功返回 1;
      插入位置不和法,返回 -1;
      顺序表满返回  0 */

    int j;
    if (i<1 || i > L->length + 1)   
    {
        printf("插入位置不合法 !");
        return -1;
    }
    else if (L->length >= LISTSIZE) 
    {
        printf("顺序表已满不能插入 !");
        return 0;
    }
    else
    {
        for (j = L->length; j >= i; j--)
            L->list[j] = L->list[j - 1];
        L->list[i - 1] = e;          //插入元素到底 i 个位置 
        L->length =L->length + 1;              //顺序表长度 +1
        return 1;
    }
}

// 6 删除操作
/*
删除                   i                  长度j
序号   1   2   3   4   5   6   7   8   9   10

                    list[i-1]            list[j-1] 
list   0   1   2   3   4   5   6   7   8   9
*/
int DeleteList(SeqList *L, int i, DataType *e) 
{
    int j;
    if (i<1 || i>L->length)      
    {
        printf("删除位置不合法!");
        return -1;
    }
    else if (L->length <= 0) {
        printf("顺序表已空,不能进行删除操作!");
        return 0;
    }
    else
    {
        *e = L->list[i - 1];          //删除的值保存到 e 中,以防要用
        for (j = i; j <= L->length - 1; j++)
            L->list[j - 1] = L->list[j];
        L->length = L->length - 1;
        return 1;
    }

}

// 7 获取长度
int ListLength(SeqList L) {
    return L.length;
}

//清空操作
void ClearList(SeqList *L) {
    L->length = 0;
}

例1:
利用顺序表的基本运算,实现如果在顺序表A中出现的元素,在顺序表B中也出现,则将A中该元素删除

#include <stdio.h>               /*包含输入输出头文件*/
#include <stdlib.h>              /* system("pause") VS编译调试 */
#define LISTSIZE  100
typedef int DataType;

#include "SeqList.h"             /* 包含顺序表实现文件 */

void DelElem(SeqList *A, SeqList B);

void main() {
    int i, j, flag;
    SeqList A, B;
    DataType e;
    InitList(&A);
    InitList(&B);
    for (i = 1; i <= 10; i++) {
        if (InsertList(&A, i, i) == 0)
        {
            printf("插入Seq A出错!");
            return ;
        }
    }
    for (i = 1, j = 1; j <= 6; i = i + 2, j++) {
        if (InsertList(&B, j, i*2) == 0) {
            printf("插入Seq B出错!");
            return ;
        }
    }
    printf("顺序表A中元素的顺序:\n");
    for (i = 0; i <= A.length; i++) {
        flag = GetElem(A, i, &e);
        if (flag == 1)
            printf("%4d", e);
    }
    printf("\n");
    printf("顺序表B中元素的顺序:\n");
    for (i = 0; i <= B.length; i++) {
        flag = GetElem(B, i, &e);
        if (flag == 1)
            printf("%4d", e);
    }
    printf("\n");

    printf("将在A中出现的B的元素删除后A中的元素:\n");

    DelElem(&A,B);

    for (int i = 0; i <= A.length; i++) {
        flag = GetElem(A, i, &e);
        if (flag == 1)
        {
            printf("%4d", e);
        }
    }
    printf("\n");
    system("pause");
}
//删除A中出现的B的元素
void DelElem(SeqList *A ,SeqList B) 
{
    int i,flag,pos;
    DataType e;
    DataType t;
    for (i = 0; i <= B.length; i++) {
        flag = GetElem(B, i, &e);
        if (flag == 1) 
        {
            pos = LocateElem(*A, e);
            if (pos > 0) {
                DeleteList(A, pos+1, &e); //pos+1 容易出现错误的地方
            }
        }
    }
}

运行结果

例2
顺序表A和顺序表B的元素都是非递减排列,利用顺序表的基本运算,将它们合并成一个顺序表C,要求C也是非递减排列。例如,A=(6,11,11,23),B=(2,10,12,12,21),则C=(2,6,11,11,12,12,21,23)。

#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 100
typedef int DataType;
#include "SeqList.h"

/*合并顺序表 A 和 B 到 C 的函数声明*/
void MergeList(SeqList A, SeqList B, SeqList *C);

void main() {
    int i, flag;
    DataType a[] = { 6,11,11,23 };
    DataType b[] = { 2,10,12,12,21 };
    DataType e;
    SeqList A, B, C;
    InitList(&A);
    InitList(&B);
    InitList(&C);

    /* 数组 a 中的元素插入到顺序表 A 中 */
    for (i = 1; i <= (sizeof(a) / sizeof(a[0])); i++) {
        flag = InsertList(&A, i, a[i - 1]);
        if (flag == 0) {
            printf("插入位置非法!");
            return;
        }
    }
    /* 数组 b 中的元素插入到顺序表 B 中 */
    for (i = 1; i <= (sizeof(b) / sizeof(b[0])); i++) {
        flag = InsertList(&B, i, b[i - 1]);
        if (flag == 0) {
            printf("插入位置非法!");
            return;
        }
    }
    printf("顺序表A中的元素:\n");
    for (i = 1; i <= A.length; i++) {
        flag = GetElem(A, i, &e);
        if (flag == 1)
            printf("%4d", e);
    }
    printf("\n");
    printf("顺序表B中的元素:\n");
    for (i = 1; i <= B.length; i++) {
        flag = GetElem(B, i, &e);
        if (flag == 1)
            printf("%4d", e);
    }
    printf("\n");
    printf("将在A中出现B的元素合并后C中的元素:\n");
    MergeList(A, B, &C);

    for (i = 1; i <= C.length; i++) {
        flag = GetElem(C, i, &e);
        if (flag == 1) {
            printf("%4d", e);
        }
    }
    printf("\n");
    printf("   C.Length:%4d", C.length);
    printf("\n");
    system("pause");
}
void MergeList(SeqList A, SeqList B, SeqList *C) 
{
    int i, j, k;
    DataType e1, e2;
    i = 1; j = 1; k = 1;
    while (i <= A.length&&j <= B.length) { 
        GetElem(A, i, &e1);            //取出顺序表 A 中的元素
        GetElem(B, j, &e2);            //取出顺序表 B 中的元素
        if (e1 <= e2) {                
            InsertList(C, k, e1);      //将较小的插入 C 中
            i++;                       //往后移一个位置,准备比较下一个元素
            k++;                   
        }
        else
        {
            InsertList(C, k, e2);
            j++;
            k++;
        }
    }
    while (i <= A.length)       //如果A中元素还有剩余,这时B中已经没有元素
    {
        GetElem(A, i, &e1);
        InsertList(C, k, e1);   //将A中剩余元素插入到C中
        i++;
        k++;
    }
    while (j <= B.length)       //如果B中还有元素剩余,此时A中已经没有元素
    {
        GetElem(A, j, &e2);
        InsertList(C, k, e2);   //将B中剩余元素插入到C中
        j++;
        k++;
    }
}

运行结果

以上内容来自《跟我学数据结构》陈锐 葛丽萍编著,尊重作者,购买图书。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值