数据结构(C语言版)严蔚敏(线性表队列栈数组树图等数据结构参考代码,持续更新中。。。)

Posted il_持之以恒_li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏(线性表队列栈数组树图等数据结构参考代码,持续更新中。。。)相关的知识,希望对你有一定的参考价值。

前言:本篇文章主要提供相关数据结构的实现的参考代码

1. 线性表

线性表的顺序存储(顺序表)和链式存储(链表)

1.1 顺序表

头文件:SqList.h

#ifndef SQLIST_H_INCLUDED
#define SQLIST_H_INCLUDED

#define LIST_INIT_SIZE 100
// 顺序表初始大小
#define LISTINCREMENT 10
// 超出当前顺序表容量时增加的容量大小

typedef int ElemType;

typedef struct
    ElemType *data;
    // 动态分配数组指针
    int length,MaxSize;
SqList;

void InitList_Sq(SqList &L);
// 构造一个空的顺序表L
void DestroyList_Sq(SqList &L);
// 销毁顺序表L
void ClearList_Sq(SqList &L);
// 将顺序表L重置为空
bool ListEmpty_Sq(SqList L);
// 判断顺序表L是否为空
int ListLength_Sq(SqList L);
// 返回顺序表L中数据元素的个数
bool GetElem_Sq(SqList L,int pos,int &e);
// 用e返回顺序表L中第pos个数据元素的值
bool ListInsert_Sq(SqList &L,int pos,int e);
// 在顺序表L中第pos个位置之前插入新的元素e
bool ListDelete_Sq(SqList &L,int pos,int &e);
// 删除顺序表L的第pos个数据元素,并用e返回
int LocateElem_Sq(SqList L,int e);
// 返回顺序表L中第一个与e相等的数据元素的位序

#endif // SQLIST_H_INCLUDED

其他文件:SqList.cpp

#include "SqList.h"
#include <stdlib.h>


void InitList_Sq(SqList &L)
    L.data = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!L.data)
        exit(-1);
    L.length = 0;
    L.MaxSize = LIST_INIT_SIZE;


void DestroyList_Sq(SqList &L)
    free(L.data);
    // 释放data所指向的内存空间
    L.data = NULL;
    L.length = 0;
    L.MaxSize = 0;


void ClearList_Sq(SqList &L)
    L.length = 0;


bool ListEmpty_Sq(SqList L)
    return L.length == 0;


int ListLength_Sq(SqList L)
    return L.length;


bool GetElem_Sq(SqList L,int pos,int &e)
    if(pos<1 || pos>L.length)
        return false;
    e = L.data[pos-1];
    return true;


bool ListInsert_Sq(SqList &L,int pos,int e)
    if(pos<1 || pos >L.length + 1)
        return false;

    if(L.length >= L.MaxSize)
        ElemType *newbase = (ElemType *)realloc(L.data,(L.MaxSize+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase)
            exit(-1);
        L.MaxSize += LISTINCREMENT;
    

    ElemType *p = &(L.data[pos-1]);
    for(ElemType *p1 = &(L.data[L.length-1]);p1>=p;p1--)
        *(p1+1) = *p1;
    *p = e;
    // 用指针实现

    /*for(int i = L.length-1;i>=pos;i--)
        L.data[i+1] = L.data[i];
    L.[pos-1] = e;*/

    ++ L.length;
    return true;


bool ListDelete_Sq(SqList &L,int pos,int &e)
    if(pos<1 || pos>L.length)
        return false;

    ElemType *p = &(L.data[pos-1]);
    e = *p;
    /*for(int i = pos;i<L.length;i++)
        L.data[i-1] = L.data[i];*/

    for(;p<&(L.data[L.length-1]);p++)
        *p = *(p+1);
    -- L.length;

    return true;


int LocateElem_Sq(SqList L,int e)
    for(int i=0;i<L.length;i++)
        if(L.data[i] == e)
            return i+1;
    return -1;

主文件:main.cpp

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

void Print_SqList(SqList L)
    ElemType e;
    for(int i=0;i<L.length;i++)
        GetElem_Sq(L,i+1,e);
        printf("%d  ",e);
    


int main()

    SqList Sq;
    InitList_Sq(Sq);
    for(int i=0;i<200;i++)
        ListInsert_Sq(Sq,i+1,i+1);

    ListInsert_Sq(Sq,100,300);
    Print_SqList(Sq);

    ElemType e;
    e = LocateElem_Sq(Sq,300);
    printf("\\n%d\\n",e);
    Print_SqList(Sq);

    ListDelete_Sq(Sq,100,e);
    printf("\\n%d\\n",e);
    Print_SqList(Sq);

    return 0;


运行结果:

关于运行结果的解释:先在顺序表中插入1-200这些数,然后在顺序表下标为100处插入数据元素300,最后将顺序表下标为100的数据元素删除。

1.2 链表

以上是关于数据结构(C语言版)严蔚敏(线性表队列栈数组树图等数据结构参考代码,持续更新中。。。)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏(线性表队列栈串树图等数据结构参考代码,持续更新中。。。)

谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告知,非常感谢

数据结构笔记(C语言版)严蔚敏

5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

《数据结构:c语言版》(严蔚敏)知识点整合

2-6-静态链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版