数据结构严蔚敏全部代码(正在更新中)(详细到书中每一个ADT及算法段以及入门演示代码 COVER BY:数据结构算法实现及解析 (修改版可直接运行文件)(更新于2020.11.10))

该博客详细介绍了数据结构的各个章节,包括三元组实现、线性表的顺序表和链表、栈、队列、KMP算法、二叉树等,并提供了相应的C++代码实现,便于学习和实践。
摘要由CSDN通过智能技术生成

第一章 绪论

三元组的实现

c1.h 万能头文件

#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<process.h>
#include<iostream>
using namespace std;

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

typedef int Status;//函数返回类型
typedef int Boolean;//布尔类型
typedef int ElemType;

c1-1.h

typedef ELemType *Tripelet;

bo1-1.cpp

#include "c1.h"
#include "c1-1.h"

Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
   
    if(!(T=(ElemType *)malloc(3*sizeof(ElemType))))
        exit(OVERFLOW);
    T[0]=v1,T[1]=v2,T[2]=v3;
    return OK;
}
Status DestroyTriplet(Triplet &T)
{
   
    free(T);
    T=NULL;
    return OK;
}
Status Get(Triplet T,ElemType &e,int i)
{
   
    if(i<1||i>2)
        return ERROR;
    e=T[i-1];
    return OK;
}
Status Put(Triplet &T,ElemType e,int i)
{
   
    if(i<1||i>2)
        return ERROR;
    T[i-1]=e;
    return OK;
}
Status IsAscending(Triplet T)
{
   
    return T[0]<T[1]&&T[1]<T[2];
}
Status IsDecending(Triplet T)
{
   
    return T[0]>T[1]&&T[1]>T[2];
}
Status Max(Triplet T,ElemType &e)
{
   
    e=T[0]>T[1]?T[0]>T[2]?T[0]:T[2]:T[1]>T[2]?T[1]:T[2];
    return OK;
}
Status Min(Triplet T,ElemType &e)
{
   
    e=T[0]<T[1]?T[0]<T[2]?T[0]:T[2]:T[1]<T[2]?T[1]:T[2];
    return OK;
}

main1-1.cpp(可对照上面的函数文件自行修改)

#include"c1.h"
#include"c1-1.h"
#include"bo1-1.cpp"

int main()
{
   
    Triplet T;
    ElemType m;
    Status i;
    i=InitTriplet(T,5,7,9);
    printf("调用初始化函数后,i=%d(1:成功) T的3个值为",i);
    cout<<T[0]<<' '<<T[1]<<' '<<T[2]<<endl;
    int j=2;
    i=Get(T,j,m);
    if(i==OK)
    {
   
        cout<<"T的第二个值为"<<m<<endl;
    }
    i=Put(T,2,6);
    if(i==OK)
        cout<<"将T的第2个值改为6后,T的3个值为 "<<T[0]<<' '<<T[1]<<' '<<T[2]<<endl;
    i=IsAscending(T);
    printf("调用升序函数后,是否成功? %d\n",i);
    i=IsDecending(T);
    printf("是否为降序?%d\n",i);
    j=Max(T,m);
    printf("最大值为:%d\n",m);
    j=Min(T,m);
    printf("最小值为:%d\n",m);
    i=DestroyTriplet(T);
    if(i)
        printf("成功销毁");
    else
    {
   
        printf("未能成功销毁");
    }
    return 0;
}

区分引用类型和非引用类型(注:必须保存为c++后缀即:.cpp)

algo1-3.cpp

#include<stdio.h>
void fa(int a)
{
   
	a++;
	printf("在函数fa中:a=%d\n",a);
}
void fb(int &a)
{
   
	a++;
	printf("在函数fb中:a=%d\n",a);
}
int main()
{
   
	int n=1;
	printf("在主程序中,调用函数fa之前:n=%d\n",n);
	fa(n);
	printf("在主程序中,调用函数fa之后,fb之前:n=%d\n",n);
	fb(n);
	printf("在主程序中,调用函数fb之后:n=%d\n",n);
	return 0;
}

exit的作用

algo1-4.cpp

#include"c1.h"

int a(int i)
{
   
    if(i==1)
    {
   
        printf("退出程序的运行\n");
        exit(0);//里面的值0代表正常退出运行,值为1则代表异常退出运行
    }
    return i;
}

int main()
{
   
    int i;
    printf("请输入i: ");
    scanf("%d",&i);
    printf("a(i)=%d\n",a(i));
    return 0;
}

记录程序运行时间

一般的方法是使用time.h头文件中的clock()函数

#include<stdio.h>
#include<time.h>
int main()
{
   
    clock_t begin,end;
    begin = clock();
    for(int i=0;i<1000000000;++i);//可替换为待检测的程序
    end = clock();
    printf("%lf",(double)(end-begin)/CLOCKS_PER_SEC);
    return 0;
}

另一种方法是调用sys/timb.h头文件

#include<stdio.h>
#include<sys/timeb.h>
int main()
{
   
    timeb t1,t2;
    long t;
   
    ftime(&t1);
    for(int i=1;i<1000000000;++i);
    ftime(&t2);
    t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm);
    printf("用时%ld毫秒\n",t);
    return 0;
}

增加两种时间表达方式 ( 转载 )

#include<iostream>
#include<Windows.h>
 
using namespace std;
int main()
{
   
	long begin=GetTickCount();
	for(int i=0;i<1000000000;i++);
	long end=GetTickCount();
 
	cout<<begin-start<<endl;
	return 0;
 }
#include<stdio.h>
#include <windows.h>
int main() {
   
	double run_time;
	_LARGE_INTEGER time_start;	//开始时间
	_LARGE_INTEGER time_over;	//结束时间
	double dqFreq;		//计时器频率
	LARGE_INTEGER f;	//计时器频率
	QueryPerformanceFrequency(&f);
	dqFreq=(double)f.QuadPart;
	QueryPerformanceCounter(&time_start);	//计时开始
	for(int i = 1; i <= 100000000; i++);	//要计时的程序
	QueryPerformanceCounter(&time_over);	//计时结束
	run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;
	//乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒
	printf("\nrun_time:%fus\n",run_time);
	return 0;
}

第二章 线性表

顺序表

c2-1.h 线性表动态分配顺序结构

#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 2

#ifndef _TEST_H_ 
#define _TEST_H_ 
struct SqList{
   
    ElemType *elem;
    int length;
    int listsize;
};
#endif

bo2-1.cpp 顺序表的操作

#include "c2-1.h"
#include "c1.h"

void InitList(SqList &L){
   
    L.elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
    if(!L.elem)
        exit(OVERFLOW);
    L.listsize=LIST_INIT_SIZE;
    L.length=0;
}

void DestroyList(SqList &L){
   
    free(L.elem);
    L.elem=NULL;
    L.length=0;
    L.listsize=0;
}

void ClearList(SqList &L){
   
    L.length=0;
}

Status ListEmpty(SqList L)
{
   
    return L.length==0;
}

Status ListLength(SqList L,int &len)
{
   
    return L.length;
}

Boolean ListInsert(SqList &L,int i,int e)
{
   
    ElemType *newbase,*q,*p;
    if(i<1&&i>L.length+1)
        exit(OVERFLOW);
    if(L.length>=L.listsize)
    {
   
        if(!(newbase=(ElemType*)realloc(L.elem,(sizeof(ElemType))*(L.listsize+LIST_INCREMENT))))
            exit(OVERFLOW);
    L.elem=newbase;
    L.listsize=L.listsize+LIST_INCREMENT;
    }
    q=L.elem+i-1;
    for(p=L.elem+L.length-1;p>=q;--p)
    {
   
        *(p+1)=*p;
    }
    *q=e;
    ++L.length;
    return OK;
}

Status ListDelete(SqList &L,int i,int &e)
{
   
    ElemType *p,*q;
    if(i<1||i>L.length)
        return ERROR;
    e=*(L.elem+i-1);
    for(int j=i;j<L.length;++j)
    {
   
        *(L.elem+j-1)=*(L.elem+j);
    }
    --L.length;
    return OK;
}

Boolean GetElem(SqList L,int i,ElemType &e)
{
   
    if((e=*(L.elem+i-1)))
        return OK;
    else
    {
   
        return FALSE;
    }
}

Status LocateElem(SqList L,int &i
1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相关函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相关函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相关函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相关函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相关函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相关函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相关函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相关函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相关函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相关函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相关函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相关函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相关函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相关函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相关函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相关函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相关函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相关函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相关函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相关函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相关函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相关函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相关函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相关函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相关函数:concatenate函数 1.3.9 动态堆栈 90 范例1-40
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值