单链表

2019第12周作业

限于喜欢 提交于 2019-12-28 03:53:56
作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/MS/homework/3239 我在这个课程的目标是 更好的学习函数 这个作业在那个具体方面帮助我实现目 以后的工作方面 参考文献 c语言程序设计2 基础题(一) 6-1 计算最长的字符串长度 (15 分) 本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。 函数接口定义: int max_len( char *s[], int n ); 其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。 裁判测试程序样例: #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); }

线性表

江枫思渺然 提交于 2019-12-24 19:06:18
阅读目录 一、线性表类型定义 二、顺序表 三、链表 四、总结 一、线性表类型定义 1.定义 线性表是n个数据元素的有限序列 2.基本操作 InitList(&L) #构造一个空的线性表L DestroyList(&L) #销毁线性表L ClearList(&L) #将L重置为空表 ListLength(L) #返回L中数据元素个数 GetItem(L,i,&e) #用e返回L中第i个数据元素的值 LocateElem(L,e,compare()) #返回L中第1个与e满足关系compare()的数据元素的位序。若这样的数据远古三不存在,则返回值为0 ListInsert(&L,i,e) #在L中第i个位置之前插入新的数据元素e,L的长度加1 ListDelete(&L,i,&e) #删除L的dii个数据元素,并用e返回其值,L的长度减1 二、顺序表 1.定义 线性表的顺序存储结构称为顺序表。 假设线性表的每个元素需占用l个存储单元,一般来说,线性表的第i个数据元素a i的存储位置为LOC(a i) = LOC(a 1) + (i-1)*l 2.实现 由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。在此,由于线性表的长度可变,且所需最大存储空间随问题不同而不同,则在C语言中可用动态分配的一维数组 顺序开始为为1

单链表(不带头结点)

元气小坏坏 提交于 2019-12-24 17:53:43
初稿:2017-11-18 23:50:40 单链表的结点:数据域,指针域(存储下一结点的地址) 包含函数:初始化,销毁,清空,尾插法和头插法批量录入数据,统计结点的个数,追加结点,删除结点,正序和逆序打印链表。 知识点: (1)一个结构体内部不能含有结构体本身类型的结点,但可以含有本类型的指针。 (2)易错点:删除,插入的操作可能会影响首结点的地址,要单独处理,不注意代码运行会全是bug! (3)逆序打印采用的递归,可着重看一下。 (4)批量录入数据有两种方法:头插法,链表的顺序和输入顺序正好相反。尾插法则正好相同。 (5)删除结点采用O(1)方法,分4种情况 首结点&&最后一个结点:*L = null 首结点&&不是最后一个结点:先保存下一结点的地址,用下一结点覆盖本应删除的目的结点,删除事先保存的结点 不是首结点&&最后一个结点:无法删除,必须采用伴随扫描指针的方式,获知前驱指针,才能删除 不是首结点&&不是最后一个结点:采用情况2的方法 (6)伴随指针查找value的代码(两个紧邻指针一起扫描单链表,一般删除结点时使用) //至少含有一个元素,即不为空 p = frist; q = NULL; while (p != NULL && p->data != value) { //在此通过p可以操作所有的元素 q = p;/*这两个语句是不可分割的,是一个整体,相当于原语*/

单链表的一些细节

倾然丶 夕夏残阳落幕 提交于 2019-12-23 07:15:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 去年的秋天,用js梳理了一下数据结构。 那么这个夏天,一起用C语言来品味一下数据结构之美吧。 下面这段程序就是单链表的建立函数。 里面的细节主要在于创建链表中的节点node,然后用指针将这些节点进行衔接。 需要注意的是,头节点的初始化: head=(node*)malloc(sizeof(node)); 节点指针的移动: p->next=s; p=s; 以及对于边界条件的处理: head = head->next; p->next = NULL; 整体程序如下: #include <iostream> #include <stdio.h> #include <string.h> #include <conio.h> using namespace std; typedef struct student { int data; struct student *next; }node; node *creat() { node *head,*p,*s; int x,cycle=1; head=(node*)malloc(sizeof(node)); p=head; while(cycle) { cout<<"\n please input the data: "; cin>>x; if(x!=0) { s=

数据结构——线性表

旧城冷巷雨未停 提交于 2019-12-21 15:50:00
线性表是最简单的数据结构,其主要特征有: 1、 每个线性表只有一个头元素,一个尾元素; 2、 除第一个数据元素外,每个元素都有一个直接前驱; 3、 除最后一个数据元素外,每个元素都有一个直接后继。 一、 顺序表 顺序表是用数据元素在物理上的相邻表示逻辑上的相邻。顺序表具有随机存取的特性。 用动态分配的一位数组表示顺序表如下: #define LIST_INIT_SIZE 100 #define LISTINCREMENT 50 typedef struct{ ElemType *elem; int length; int listsize; }SqList; 初始化顺序表: Status InitList_Seq(SqList &L) { L.elem = (ElemType*)malloc(LIST_NINT_SIZE*sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.length = 0; L.lisesize = LIST_INIT_SIZE; return OK; } 顺序表的插入: Status ListInsert_Seq(SqList &L, int i, ElemType e) { if(i < 1 || i > L.length + 1) return ERROR; if(L.length >= L.listsize

数据结构与算法(九)链队列——队列的链式存储结构

不问归期 提交于 2019-12-21 03:55:21
链队列 队列的链式存储结构,其实就是线性表的单链表,只不过它只能它只能尾进头出而已,我们把它就称之为链队列。 既然链队列和单链表一样,观察链队列LinkedQueue和单链表LinkedList的UML类图,可以看到两者之间是聚合关系,也就说LinkedQueue相当于LinkedList的成员变量,和我们的之前说的链栈是一样的 既然如此,也是创建LinkedList对象list实现,调用list的方法即可,当然LinkedQueue还有实现Queue接口 package DS02 . 动态链表 ; import DS01 . 动态数组 . Queue ; import java . util . Iterator ; public class LinkedQueue < E > implements Queue < E > { //声明并创建单链表对象 private LinkedList < E > list ; public LinkedQueue ( ) { list = new LinkedList < > ( ) ; } @Override public int getSize ( ) { return list . getSize ( ) ; } @Override public boolean isEmpty ( ) { return list . isEmpty

数据结构错题汇总

纵然是瞬间 提交于 2019-12-20 23:48:50
第一章: (3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 答案:B (6)以下数据结构中,( )是非线性数据结构 A.树 B.字符串 C.队列 D.栈 答案:A 第二章: (2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( )。 A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B.在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.将n个结点从小到大排序 答案:A 解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。 (5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。 A.必须是连续的 B.部分地址必须是连续的 C.一定是不连续的 D.连续或不连续都可以 答案:D (8)将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( )。 A.n B.2n-1 C.2n D.n-1 答案:A 解释:当第一个有序表中所有的元素都小于(或大于

哈夫曼树

≯℡__Kan透↙ 提交于 2019-12-19 12:39:28
哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称为路径长度。二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。如果二叉树中的叶子结点都有一定的权值,则可将这一概念拓展:设二叉树具有n个带权值的叶子结点,则从根结点到每一个叶子结点的路径长度与该叶子结点权值的乘积之和称为二叉树路径长度,记做: WPL=W1L1+W2L2+......+WnLn; 其中:n为二叉树中叶子结点的个数;Wk为第k个叶子的权值;Lk为第k个叶子结点的路径长度。 若给定n个权值,如何构造一棵具有n个给定权值叶子结点的二叉树,使得其带权路径长度WPL最小?哈夫曼根据"权值大的结点尽量靠近根"这一原则,给出了一个带有一般规律的算法,称为"哈夫曼"算法,哈夫曼算法如下: (1)根据给定n个权值{w1,w2,....,wn}构成n棵二叉树的集合F={T1,T2,.....,Tn};其中,每棵二叉树Ti(1<=i<=n)只有一个带权值wi的根结点,其左、右子树均为空。 (2)在F中选取两棵根结点权值最小的二叉树作为左、右子树来构造一棵新的二叉树,且置新的二叉树根结点权值为其左右子树根结点的权值之和。 (3)在F中删除这两棵树,同时将生成新的二叉树加入到F中。 (4)重复

线性表的链式实现(一)

冷暖自知 提交于 2019-12-19 10:24:03
文章目录 链式存储的定义 链式存储的相关概念 单链表的定义 单链表的初始化 头插法 尾插法 单链表的遍历 单链表的基本操作 判断单链表是否为空 单链表的销毁 清空单链表 求单链表表长 单链表的查找 查找指定位置的元素值 查找指定元素值的位置 单链表的插入 单链表的删除 源代码 本篇文章将 来源: CSDN 作者: ~wangweijun 链接: https://blog.csdn.net/qq_42453117/article/details/103600992

c++面试总结

不问归期 提交于 2019-12-19 00:56:38
c++面试总结 1.算法 2.数据结构 3. C++ feature 4. OS 5. Network 6. Database 7. 实战 8.系统学习资料 8.1 数据结构 8.2 OS 8.3 Network 8.4 Database 8.5 Linux 8.6 C++ Programing 8.7 Other 8.8 面试指南 8.9 网站 1.算法 排序 冒泡排序 简单选择排序 直接插入排序 折半插入排序 希尔排序 快速排序 归并排序 堆排序 基数排序 计数排序 各种排序的时间复杂度,空间复杂度,是否稳定,时间复杂度是否与初始序列有关? 查找:二分查找,lower_bound, upper_bound 分治与递归:逆序对数,大数相加,大数相乘 贪婪算法 动态规划:背包问题,找零钱问题,最长公共子序列(LCS) BFS,DFS,最短路径(Dijkstra算法,Floyd算法) 字符串匹配算法:KMP算法,BM算法,Sunday算法 补充:Top-K算法,Bitmap算法, Bloom Filter算法,一致性哈希算法,8数码问题(A 算法,B 算法,IDA*算法) 2.数据结构 线性表:数组,栈,队列,链表特点以及应用场景。 数组:老鼠走迷宫问题,稀疏矩阵压缩 链表:单链表逆序,单链表去重,单链表删除结点(仅给出删除结点),两个链表交叉求交叉点