大话数据结构之『线性表的顺序结构实现』

2021-09-24 55点热度 0人点赞 0条评论

相关问题请访问我的个人网站:破壳AI.
本文首发于破壳AI.

大话数据结构 【 溢彩加强版】

提示

线性表的顺序结构 - 利用数组实现

完整代码放在 Github 上,欢迎交流

sqlist.h

/*
 * @Description: 《大话数据结构》线性表-顺序存储结构(数组)-头文件(接口)sqlist.h
 * @Author: Adair Hu
 * @WebSite: https://arctee.cn
 * @Github: https://github.com/adairhu
 * @Date: 2021-09-17 12:26:50
 * @LastEditTime: 2021-09-22 10:19:54
 * @FilePath: \DaHua\Chapter3_List\sqlist.h
 * 『戒急戒躁,心装大盘。日日耕耘,精进成长。』
 */

#ifndef _SQLIST_H_
#define _SQLIST_H_

#include <stdbool.h>

#define MAXSIZE 20

typedef int ElemType;
// 线性表顺序存储结构
typedef struct {
    ElemType data[MAXSIZE];
    int length;
} SqList;


// 记忆口诀:“初空个 增删改查 取遍清”


// 1、初始化
void InitList(SqList * list);

// 2、判断是否空
bool ListIsEmpty(SqList list);

// 3、元素个数
int ListLength(SqList list);

// 4、增
bool ListInsert(SqList * list, int i, ElemType e);

// 5、删
bool ListDelet(SqList * list, int i, ElemType * e);

// 6、改
bool ListChange(SqList * list, int i, ElemType e);

// 7、查
int LocateElem(SqList list, ElemType e);

// 8、取
bool GetElem(SqList list, int i, ElemType * e);

// 9、遍
void ListTraverse(SqList list, void (*func)(ElemType elem));

// 10、清空
void Clear(SqList * list);

//合并两个线性表
void UnionL(SqList * La, SqList Lb);


#endif

sqlist.c

/*
 * @Description: 《大话数据结构》线性表-顺序存储结构(数组)- 实现接口
 * @Author: Adair Hu
 * @WebSite: https://arctee.cn
 * @Github: https://github.com/adairhu
 * @Date: 2021-09-17 12:23:16
 * @LastEditTime: 2021-09-20 20:18:37
 * @FilePath: \DaHua\Chapter3_List\sqlist.c
 * 『戒急戒躁,心装大盘。日日耕耘,精进成长。』
 */

#include <stdio.h>
#include "sqlist.h"

// 记忆口诀:“初空个 增删改查 取遍清”

// 1、初——初始化
void InitList(SqList * list) 
{
    // for (int j = 0; j < list->length; j++) {
    //     list->data[j] = 0;
    // }

    list->length = 0;
}

// 2、空——判断是否空
bool ListIsEmpty(SqList list)
{
    if (list.length == 0)
        return true;
    else 
        return false;
}

// 3、个——获取元素个数
int ListLength(SqList list)
{
    return list.length;
}

// 4、增——在表的第i个位置插入元素e
bool ListInsert(SqList * list, int i, ElemType e)
{
    if(list->length >= MAXSIZE) //数组已满,抛出异常
        return false;
    if (i < 1 || i > list->length + 1) //插入范围错误,抛出异常
        return false;
    //插入的位置不在length+1处
    if (i <= list->length) {
        for (int j = list->length -1 ; j >= i - 1; j--) 
            list->data[j + 1] = list->data[j];
    }
    list->data[i-1] = e; //如果插入位置在length+1,这条语句也包含了这种情况
    list->length++;

    return true;
}

// 5、删——删除表中位置i的元素,并存储在e中
bool ListDelet(SqList * list, int i, ElemType * e)
{   if (list->length == 0)
        return false;
    if(i < 1 || i > list->length)
        return false;
    *e = list->data[i-1]; 
    if (i < list->length) {    //删除的不是最后位置
        for (int j = i; j <= list->length; j++) 
            list->data[j-1] = list->data[j];
    }
    list->length--; //包含了删除最后一个元素的情况

    return true;
}

// 6、改——将表中第i个元素改为e
bool ListChange(SqList * list, int i, ElemType e)
{
    if (i < 1 || i > list->length) {
        puts("i out of range.");
        return false;
    }
    list->data[i - 1] = e;

    return true;
}

// 7、查——查询线性表中是否存在元素e,找到返回表中序号,否则返回0
int LocateElem(SqList list, ElemType e)
{
    if (list.length == 0)
        return 0;
    for (int j = 0; j < list.length; j++) {
        if (list.data[j] == e)
            return (j+1);
    }
    return 0;
}

// 8、取——获取第i个位置的元素,并存储在e中
bool GetElem(SqList list, int i, ElemType * e)
{
    if (list.length == 0 || i < 1 || i > list.length) //异常处理
        return false;
    *e = list.data[i-1];

    return true;
}

// 9、遍——遍历所有元素,执行某种操作
void ListTraverse(SqList list, void (*func)(ElemType elem))
{
    for (int i = 0; i < list.length; i++) {
        (*func)(list.data[i]);
    }
}

// 10、清——清空线性表
void Clear(SqList * list)
{
    // for (int j = 0; j < list->length; j++) {
    //     list->data[j] = 0;
    // }

    list->length = 0;
}

//合并两个线性表
void UnionL(SqList * La, SqList Lb)
{
    int lbLength = ListLength(Lb);
    int laLength = ListLength(*La);
    ElemType e;

    for (int i = 0; i < lbLength; i++) {
        GetElem(Lb, i, &e);
        if (!LocateElem(*La, e)) {
            ListInsert(La, laLength++, e);
        }
    }
}

main.c

/*
 * @Description: 《大话数据结构》线性表-顺序存储结构(数组)-测试
 * @Author: Adair Hu
 * @Github: https://github.com/adairhu
 * @Date: 2021-09-17 22:34:23
 * @LastEditTime: 2021-09-20 20:09:57
 * @FilePath: \DaHua\Chapter3_List\mian.c
 * 『戒急戒躁,心装大盘。日日耕耘,精进成长。』
 */

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"

void printList(ElemType elem);

int main(void)
{   
    LinkList newList;
    ElemType e;

    InitList(&newList);

    ListInsert(&newList, 1, 5);
    ListInsert(&newList, 2, 10);
    ListInsert(&newList, 3, 1);
    ListInsert(&newList, 4, 90);
    ListInsert(&newList, 5, 15);
    ListInsert(&newList, 6, 123);

    ListDelet(&newList, 4, &e);

    ListChange(&newList, 1, 0);

    if (ListIsEmpty(newList)) {
        printf("List is empty!");
        exit(1);
    }
    ListTraverse(newList, *printList);
    printf("Number of Elements: %d\n", ListLength(newList));

    return 0;
}

// 打印元素
void printList(ElemType elem)
{
    printf("%d ", elem);
}

更多问题请访问我的个人网站:破壳AI.
大家一起学习交流!

订阅博客,及时获取文章更新邮件通知

close

订阅博客,及时获取文章更新邮件通知

古月弧

保持专注,持续进步。

文章评论

您需要 登录 之后才可以评论