数据结构(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年的课本?麻烦把目录告知,非常感谢