n(n >= 0)个具有相同特性数据元素的有限序列
是一种抽象数据类型,包含
‘{D, S, P}’
通过固有数据类型实现
ADT | triplet |
---|---|
数据对象 | D = ‘{v1, v2, v3}’ |
数据关系 | R = ‘{<v1, v2>, <v2, v3>}’ |
基本操作 | |
init_triplet(&T, n1, n2, n3) | 结果:构造三元组 T,对元素 v1,v2,v3 分别赋以 n1,n2,n3 的值 |
max(T, &e) | 条件:存在;结果:找到 T 中数据元素的最大值,用 e 返回\ |
在内存中开辟连续的存储空间,用连续的存储单元依次存放线性表的元素。
删除重复元素
已知顺序表的元素按非降序排列。请编写算法,删除表中的重复元素。例如,原表为(1,1,2,3,3,3,4,5,5),经算法处理后,表为(1,2,3,4,5)。要求算法的空间复杂度为 O(1),不需输出表元素的值。
基本特性:用一组物理位置任意的存储单元存储线性表的结点,物理位置的关系不能反映结点间的逻辑关系。
结构:数据域=>存储元素本身的信息;指针域=>结点的直接后继结点的内存地址。
注:创建结点时需要开辟内存,删除结点时记得释放空间。
链表最后一个结点的指针域不是 null,而是头结点的地址,表形成一个环。
分别指向直接前趋和直接后继:
对称性:前趋的后继就是它自己。
在双向链表结点 P 之前插入 S 结点:
删除结点:
顺序表的存储空间是静态分配的,在程序执行前必须规定其存储规模。
链表的存储空间是动态分配的,只要内存空间有空闲,就不会溢出。
顺序存储 | 链式存储 | |
---|---|---|
循环变量 | 下标变量 i | 指针变量 p |
初始化 | i = 0 | head=null 或 head->next=null |
处理对象 | a[j], *(a+i) | *p |
下一对象 | i = i + 1 | p = p->next |
循环条件 | i < len | p != null |
编写函数,从一个顺序表 A 中删除元素值在 x 和 y(x≤y)之间的所有元素
编写函数,将一个顺序表 A(有 n 个元素且任何元素均不为 0),分拆成两个顺序表 B 和 C。使 A 中大于 0 的元素存放在 B 中,小于 0 的元素存放在 C 中,返回顺序表 B 和 C。
已知一个单链表,编写一个函数将该单链表复制到另一个单链表中。
如下类型定义:
typedef struct node
’{ int exp; //指数
float coef; //系数
struct node *next;
}‘polynode;
【要求】用链式存储结构实现:生成两个多项式 PA 和 PB,求 PA 和 PB 之和,并输出“和多项式”。
约瑟夫生者死者问题。据说著名犹太历史学家 Josephus 有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式:41 个人排成一个圆圈,由第 1 个人开始报数,每报数到第 3 人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而 Josephus 和他的朋友并不想遵从,Josephus 要他的朋友先假装遵从,他将朋友与自己安排在第 16 个与第 31 个位置,于是逃过了这场死亡游戏。这就是著名的约瑟夫生者死者问题。
17 世纪的法国数学家加斯帕在《数目的游戏问题》中也讲了这样一个故事:15 个教徒和 15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30 个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余 15 个人为止。【问题】怎样的安排才能使每次投入大海的都是非教徒?
请编程解决这一 n(1≤n≤30)个人的跳海问题。要求分别用两种线性表的存储结构来解决。【提示】在使用链式存储结构时,可构造具有 30 个结点的单循环链表。