数据结构(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 单链表

头文件:LinkList.h

#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

typedef int ElemType;

typedef struct LNode
    ElemType data;
    struct LNode *next;
LNode,*LinkList;

void InitLinkList(LinkList &L);
// 初始化单链表L
bool LinkListEmpty(LinkList L);
// 判断单链表L是否为空
int LinkListLength(LinkList L);
// 获取单链表L的长度
void ClearLinkList(LinkList &L);
// 清空单链表L
bool GetLinkListElem(LinkList L,int pos,ElemType &e);
// 获取pos位置上的数据元素数据项data的值,用e返回
bool LinkListInsert(LinkList &L,int pos,ElemType e);
// 在单链表L中第pos个位置上插入数据元素
bool LinkListDelete(LinkList &L,int pos,ElemType &e);
// 删除单链表L位置为pos的数据元素,并用e返回其数据项data的值
int LocateLinkList(LinkList L,ElemType e);
// 定位
LNode* LinkListInsertHead(LinkList &L);
// 头插法建立单链表L
LNode* LinkListInsertTail(LinkList &L);
// 尾插法建立单链表L

#endif // LINKLIST_H_INCLUDED

其他文件:LinkList.cpp

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


void InitLinkList(LinkList &L)
    L = (LNode *)malloc(sizeof(LNode));
    if(!L)
        exit(-1);
    L->next = NULL;

// 初始化单链表L
bool LinkListEmpty(LinkList L)
    return L->next == NULL;

// 判断单链表L是否为空
int LinkListLength(LinkList L)
    LNode *p = L->next;
    int num = 0;
    while(p)
        p = p->next;
        num ++;
    
    return num;

// 获取单链表L的长度
void ClearLinkList(LinkList &L)
    LNode *p = L->next,*n;
    L->next = NULL;
    while(p)
        n = p;
        p = p->next;
        free(n);
    

// 清空单链表L
bool GetLinkListElem(LinkList L,int pos,ElemType &e)
    LNode *p = L->next;
    int i = 1;
    if(pos<1)
        return false;

    while(p&&i<pos)
        p = p->next;
        i++;
    
    if(!p||i>pos)
        return false;

    e = p->data;
    return true;

// 获取pos位置上的数据元素数据项data的值,用e返回
bool LinkListInsert(LinkList &L,int pos,ElemType e)
    LNode *p = L,*node;
    int i = 0;
    while(p&&i<pos-1)
        p = p->next;
        i++;
    

    if(!p||pos<1)
        return false;

    node = (LNode *)malloc(sizeof(LNode));
    node->data = e;
    // 新创建的节点node
    node->next = p->next;
    p->next = node;

    return true;

// 在单链表L中第pos个位置上插入数据元素
bool LinkListDelete(LinkList &L,int pos,ElemType &e)
    LNode *p = L,*node;
    int i = 0;
    while(p->next&&i<pos-1)
        p = p->next;
        i++;
    

    if(!(p->next)||pos<1)
        return false;

    node = p->next;
    p->next = node->next;
    e = node->data;
    free(node);
    return true;

// 删除单链表L位置为pos的数据元素,并用e返回其数据项data的值
int LocateLinkList(LinkList L,ElemType e)
    LNode *p = L->next;
    int index = 1;
    while(p)
        if(p->data == e)
            return index;
        p = p->next;
        index++;
    
    return -1;

// 定位
LNode* LinkListInsertHead(LinkList &L)
    LNode* node;
    L = (LNode *)malloc(sizeof(LNode));
    L->next = NULL;
    ElemType e;
    scanf("%d",&e);
    while(e!=9999)
        node = (LNode *)malloc(sizeof(LNode));
        node->data = e;
        node->next = L->next;
        L->next = node;
        scanf("%d",&e);
    
    return L;

// 头插法建立单链表L

LNode* LinkListInsertTail(LinkList &L)
    LNode *node,*tail;
    // tail表示尾指针
    L = (LNode *)malloc(sizeof(LNode));
    tail = L;
    ElemType e;
    scanf("%d",&e);
    while(e!=9999)
        node = (LNode *)malloc(sizeof(LNode));
        node->data = e;
        tail->next = node;
        tail = node;
        scanf("%d",&e);
    
    tail->next = NULL;
    return L;

// 尾插法建立单链表L

主文件:main.cpp

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

void PrintLinkList(LinkList L);

int main()

    LinkList L,L1;
    printf("使用头插法创建单链表\\n");
    LinkListInsertHead(L);
    // 使用头插法创建单链表
    PrintLinkList(L);
    printf("使用尾插法创建单链表\\n");
    LinkListInsertTail(L1);
    // 使用尾插法创建单链表
    PrintLinkList(L1);

    int L_length = LinkListLength(L);
    printf("单链表L的长度为:%d\\n",L_length);
    bool a = LinkListInsert(L,1,100);
    // 在单链表L位置为1处插入元素值100
    printf("插入元素状态:%d\\n",a);
    PrintLinkList(L);
    ElemType e;
    a = LinkListDelete(L,7,e);
    printf("删除元素状态:%d\\n,删除元素:%d\\n",a,e);
    PrintLinkList(L);

    return 0;


void PrintLinkList(LinkList L)
    while(L->next)
        L = L->next;
        printf("%d->",L->data);
    
    printf("NULL");
    printf("\\n");


运行结果:

关于运行结果的解释:分别用头插法和尾插法创建单链表L和L1,在单链表L下标为1处插入元素100,在单链表L下标为7处删除元素1.

2.栈

2.1 顺序栈

头文件:SqStack.h

#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED

#define MAXSIZE 50
// 定义顺序栈,最长长度为50
typedef char ElemType;
typedef struct
    ElemType data[MAXSIZE];
    int top;
    // 栈顶指针
SqStack;

void InitSqStack(SqStack &S);
// 初始化顺序栈
bool SqStackEmpty(SqStack S);
// 判断顺序栈是否为空
bool SqStackPush(SqStack &S,ElemType e);
// 入栈
bool SqStackPeak(SqStack S,ElemType &e);
// 获取栈顶元素
bool SqStackPop(SqStack &S,ElemType &e);
// 出栈
void DestorySqStack(SqStack &S);
// 销毁栈

#endif // SQSTACK_H_INCLUDED

其他文件:SqStack.cpp

#include "SqStack.h"


void InitSqStack(SqStack &S)
    S.top = -1;

// 初始化顺序栈
bool SqStackEmpty(SqStack S)
    return S.top == -1;

// 判断顺序栈是否为空
bool SqStackPush(SqStack &S,ElemType e数据结构(C语言版)严蔚敏(线性表队列栈数组树图等数据结构参考代码,持续更新中。。。)

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

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

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

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

2-10-归并扩展的线性单链表-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版