Advertisement

C数据结构严蔚敏版,包含全注释源码,涵盖线性表、队列、栈、监视哨、查找、折半插入排序、冒泡排序、快速选择等内容。

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
数据结构及算法C语言版,严蔚敏著。此版本在VC6环境下运行通过,包含源代码(CPP文件),涵盖了顺序线性表、单链表的插入、删除和查找等操作。此外,还包括监视哨查找、折半查找、直接插入排序、希尔排序、冒泡排序、快速排序和选择排序等经典算法。该资源提供了大量的注释,详细解释了VC6的语法特性以及各种算法的实现与理解。为了更直观地展示其功能,提供了EXE演示版本(可在 上机第一次 栈应用,转换进制题目。//请务必将每个cpp文件视为独立的项目,避免将多个cpp文件合并到同一个项目中,因为我为每个cpp文件都定义了main函数。//该教材并未提供这些功能,需要自行补充实现。typedef int SElemType;//p46书上的。#define STACK_INIT_SIZE 100 //定义初始分配的内存大小#define STACKINCREMENT 10 //每次申请内存不足时扩展的大小typedef struct{ SElemType *base; //栈底指针,构造之前为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素数量计算}SqStack; //定义顺序栈别名。//构造一个空栈SStatus InitStack(SqStack &S){ //参考List.cpp中malloc的解释 S.base=(SElemType *) malloc(STACK_INIT_SIZE * sizeof (SElemType)); if (!S.base) exit(OVERFLOW); //存储分配失败 S.top = S.base; //初始时栈顶等于栈底 S.stacksize = STACK_INIT_SIZE; //初始栈容量 return OK;} //end of InitStack//插入元素e为新的栈顶元素Status Push(SqStack &S, SElemType e){ if (S.top - S.base >= S.stacksize) //如果栈满,则扩展存储空间 { S.base = (SElemType *) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof (SElemType)); if (!S.base) exit(OVERFLOW); //存储分配失败 //调整栈顶位置 S.top = S.base + S.stacksize; //修改栈大小为新的大小 S.stacksize += STACKINCREMENT; } //*符号表示求值符 *S.top++ = e; //将e压入栈顶,然后将S.top指向下一个可用位置返回 OK;} //end of Push//若栈不空,则弹出S的栈顶元素,并将其值赋给e并返回OK;否则返回ERRORStatus Pop(SqStack &S, SElemType &e){ if (S.top == S.base) //如果栈顶等于栈底,表示空栈,则报错 return ERROR; e = *--S.top; //先减1指向当前栈顶元素,再取值赋给e return OK;}//书上没有这部分内容,自行添加用于处理每个元素的dataStatus PrintEach(SElemType e){ cout<

全部评论 (0)

还没有任何评论哟~
客服
客服
  • (C语言)_: 线(二分法)、
    优质
    本书为《数据结构(C语言版)》的配套书籍,提供了线性表、队列、栈等数据结构及二分查找、插入排序、冒泡排序、快速排序和选择排序算法的全注释源码。 本段落档包含了使用C语言编写的数据结构及算法代码,基于严蔚敏版教材,并在Microsoft Visual C++ 6.0环境下成功运行过。文档中的源码为CPP文件格式,涵盖了顺序线性表、单链表的插入、删除和查找操作等基础数据结构功能;同时包括了监视哨查找法、折半查找法以及直接插入排序、希尔排序、冒泡排序、快速排序及选择排序等多种经典算法,并且每个代码段都配有详细的注释,帮助理解C语言语法与相关算法原理。 摘录的示例源码如下: ```cpp #include using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int SElemType; // 定义栈元素类型为整型 //定义顺序栈结构体以及初始化函数等实现细节已省略... void conversion() { SqStack S; unsigned int N; SElemType e; InitStack(S); // 初始化空栈S cout << 请输入非负十进制整数N (N>=0) << endl; cin >> N; while (N) { // 输入的数字不为零时循环执行以下操作: Push(S, N % 8); N = N / 8; } cout << 从底到顶输出栈内的内容,用于调试: << endl; StackTraverse(S, PrintEach); cout << endl; while (!StackEmpty(S)) { Pop(S, e); printf(%d, e); // 输出转换后的八进制数 } } int main() { for(int i = 0; i < 4; ++i) conversion(); return 0; } ``` 该段代码实现了将用户输入的十进制整数转化为对应的八进制表示的功能,通过栈数据结构来辅助实现数值转换的过程。
  • 算法合集-直接、2-路、希尔、起及简单
    优质
    本资源汇集多种经典排序算法,包括直接插入、折半插入、2-路插入、表插入、希尔、起泡、快速和简单选择排序,适用于深入学习与实践。 实现以下常用的内部排序算法并进行性能比较:直接插入排序、折半插入排序、2-路插入排序、表插入排序、希尔排序、起泡排序、快速排序、简单选择排序、树形选择排序、堆排序和 归并排序, 以及 链式基数排序。基本要求:待排序的列表长度不少于100;其中的数据需使用伪随机数生成程序产生;至少要用5组不同的输入数据进行比较;比较指标为包括关键字参与的比较次数及关键字移动次数(一次交换计作三次移动)。
  • 七种算法详解(直接、希尔、、简单和归并
    优质
    本文详细解析了七种常见的排序算法,包括直接插入、折半插入、希尔、冒泡、快速、简单选择及归并排序,帮助读者全面理解每种算法的原理与应用场景。 请提供七种排序算法的实现方法:直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序以及归并排序。此外,请完成以下两个问题: 1. 设计一个有效的算法,用于对n个整数进行重排,使得所有负数位于非负数之前,并给出该算法的性能分析。 2. 提供一个有效的方法来同时找到n个元素中的最大值和最小值,并解释其有效性。
  • 直接、二分、Shell和堆的实现
    优质
    本文介绍了七种经典内部排序算法(直接插入排序、二分插入排序、希尔排序、冒泡排序、快速排序、选择排序及堆排序)的基本原理,并提供了具体实现方法。 《数据结构(C语言版)》由严蔚敏与吴伟民编著,书中介绍了直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序的实现以及归并排序等内容,并使用C语言进行了详细实现。
  • 直接详细算法实现及能对比)
    优质
    本文探讨了四种基本排序算法——直接插入排序、快速排序、选择排序和冒泡排序,并提供了详细的算法实现代码及其性能分析。 数据结构中的直接插入排序、快速排序、选择排序和冒泡排序是常见的基本算法。下面将详细介绍这些算法的具体实现方法,并对它们的性能进行比较分析。 1. **直接插入排序**:该算法通过构建有序序列,对于未排序的数据,在已排好序的序列中从后向前扫描,找到相应位置并插入。 2. **快速排序**:是一种分治策略的应用。它选择一个“基准”元素,并将数组分为两个子数组,左边的所有元素都比基准小,右边所有元素都比基准大;然后递归地对这两部分进行相同的操作。 3. **选择排序**(通常指简单选择排序):该算法每次从未排序的部分选取最小的元素放到已排好序序列的末尾。每一次循环中找到未排序子数组中的最小值,将其与当前第一个位置交换。 4. **冒泡排序**:通过重复地遍历要排序的一组数,并比较每对相邻的数据项,如果它们的顺序错误就把它们交换过来。该算法的名字由这样的事实而得名:较小或者较大的元素会像气泡一样逐渐“浮”到顶端。 性能分析: - 在最理想的情况下(即输入数组已经完全有序),直接插入排序和冒泡排序的时间复杂度为O(n),其中n是待排序的记录个数;选择排序无论在最好还是最坏情况下,时间复杂度都是O(n^2)。 - 快速排序在平均情况下的性能是最好的,其时间复杂度接近于O(n log n),但在最差的情况下(如输入数组已经是完全有序或逆序),快速排序的时间复杂性退化为O(n^2)。 总结来说,每种算法都有自己的适用场景。例如,在数据量较小或者已经部分排好序的时候使用直接插入排序更加高效;对于大数据集的处理,则通常推荐采用快速排序以获得较好的性能表现。
  • 10种算法的代及综合比较(括直接、希尔、简单、堆、归并、基...)
    优质
    本文全面介绍了十种常见的排序算法,提供每种算法的详细代码实现,并进行性能对比分析,帮助读者理解其优缺点及应用场景。 本段落提供了10种排序算法的代码及其综合比较:直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序以及2路插入排序。除了每种算法的具体实现,还包括了关键字比较次数和移动次数的统计,以及实际运行时间的对比分析代码。
  • 多种算法的实现代、希尔、归并、堆、计、桶和基
    优质
    本项目包含十种常见排序算法的实现代码,包括冒泡排序、选择排序等基本算法及更高效的归并排序、快速排序等,适用于学习与实践。 该程序实现了多种排序算法,并提供了选项菜单供用户选择排序算法。此外还包括查找最大最小值、计算平均值和总和的功能。 主函数 main:包含一个主程序循环,通过显示的菜单让用户选择所需的排序算法或其他功能。 菜单显示函数 displayMenu:打印出可供选择的不同排序算法的菜单。 各种排序算法实现的函数包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序和基数排序。 查找最大最小值函数 findMinMax:用于在给定数组中找出最大的值和最小的值。 计算平均值和总和函数 calculateAverageSum:用以计算给定数组元素的平均值及所有元素之和。
  • 算法讲解——
    优质
    本课程详细介绍了三种基本的排序算法:冒泡排序、插入排序和选择排序。通过实例演示了每种算法的工作原理及其在实际编程中的应用,帮助初学者理解并掌握这些核心概念。 在计算机科学领域,排序算法是数据处理的重要组成部分之一,它们用于对一组数据进行排列以便于检索、分析或进一步的处理工作。本段落将重点介绍三种基础的排序算法:冒泡排序、插入排序以及选择排序。 首先来看冒泡排序法。这是一种简单的排序方法,其基本原理是通过反复遍历数组,并在每次遍历时比较相邻元素的位置关系,若顺序错误则交换它们,从而使得未排列的最大值逐次向数组末尾移动。具体实现如下所示: ```python def bubblesort(bubbleList): flag = True n = len(bubbleList) while(n): for i in range(n-1): if bubbleList[i] > bubbleList[i+1]: bubbleList[i], bubbleList[i+1] = bubbleList[i+1], bubbleList[i] flag = False if flag: break n -= 1 return bubbleList ``` 冒泡排序的时间复杂度为O(n^2),其中n代表数组的长度。尽管效率不高,但其优点在于实现简单且稳定,即相等元素在经过排序处理后不会改变它们之间的相对位置。 接下来是插入排序法。它从数组中的第二个数字开始,并将每个新找到的数依次插入到已排好序的部分中去,通过比较前面的数据来确定正确的插入点。其Python代码实现如下: ```python def insertion_sort(Insertion_List): n = len(Insertion_List) for i in range(1, n): key = Insertion_List[i] j = i - 1 while j >= 0 and Insertion_List[j] > key: Insertion_List[j + 1] = Insertion_List[j] j -= 1 Insertion_List[j + 1] = key return Insertion_List ``` 插入排序的时间复杂度同样是O(n^2),但它在处理部分有序的数据集时效率较高,且同样是一种稳定的算法。 最后是选择排序法。它通过找到数组中最小(或最大)的元素,并将其与第一个未排列的位置进行交换,然后重复这个过程直到所有数据都被正确地排好序为止。其Python代码实现如下: ```python def select_sort(select_List): n = len(select_List) for i in range(n): min_num = i for j in range(i+1, n): if select_List[j] < select_List[min_num]: min_num = j select_List[min_num], select_List[i] = select_List[i], select_List[min_num] return select_List ``` 选择排序的时间复杂度同样为O(n^2),但它是不稳定的,即相等元素可能会在排列过程中改变它们的相对位置。尽管如此,在内存限制的情况下由于它只需要一个额外的空间用于临时存储数据,因此具有一定的优势。 总结来说,冒泡排序、插入排序和选择排序都是基于比较的基本算法,并且各自适用于不同的场景:对于小规模的数据集或接近有序的情况,可以考虑使用冒泡排序;而对于部分已经排好序的数组,则推荐采用插入排序法;而当内存资源有限时,可以选择使用空间复杂度为O(1)的选择排序。然而,在面对大量数据处理需求的时候,这些简单的算法通常会被更高效的快速排序、归并排序或堆排序等方法所替代。
  • 算法汇总(、希尔、、堆、归并及基
    优质
    本文章全面总结了常见的内部排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序以及基数排序,帮助读者理解每种算法的原理与应用场景。 在我们期末考试的时候我编写了一些内部排序的示例代码,因为我们的数据结构课程只涵盖内部排序的内容,所以我只能专注于练习这些排序算法.有些内排序的思想很好理解,并且可以通过图示来帮助理解和学习,但是实现起来可能比较复杂;而另外一些则难以理解并且编码也较为困难。这让我颇费了一番心思。 下面我会展示我编写的程序主框架代码: ```cpp // 头文件包含 #include using namespace std; #include InsertionSort.h #include ShellsSort.h #include QuickSort.h #include SelectionSort.h #include MergingSort.h #include RadixSort.h #define LENGTH 10 int main( int argc, char** argv ) { // 定义顺序表 SqList a; int objArray[LENGTH] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83}; // 初始化顺序表 for (int i = 1; i < a.length + 1; i++) { a.r[i].key = objArray[i-1]; a.r[i].otherinfo = \0; } // 各种排序算法的调用注释掉,可以根据需要取消 //InsertSort( a ); //BInsertSort( a ); //ShellSort(a, dlta2, 3); //BubbleSort( a ); //QuickSort( a, 1, LENGTH ); //SelectSort( a ); //HeapSort( a ); //MergeSort( a ); SLList b; int i; for (i = 1; i <= LENGTH; ++i) { b.r[i].keys[0] = objArray[i-1]%10; b.r[i].keys[1] = objArray[i-1]%100/10; b.r[i].keys[2] = objArray[i-1]/100; } // 基数排序 RadixSort( b ); for (i = 1; i < LENGTH + 1; ++i) cout << a.r[i].key << ; cout<
  • 》()第十章:
    优质
    本书《数据结构》第十章深入探讨了内部排序算法,包括插入排序、选择排序、冒泡排序、快速排序等,并分析了它们的时间复杂度和应用场景。 本段落档提供了内部排序的详细说明以及各种排序算法的具体代码实现。