实现双重连接列表,实现英文列表ADT。
需要支持以下四个运算(假设位置从第一个开始)
- add(list, position, item):在list的position的位置增加item。
- delete(list, position):删除list的position位置中的item。
- get(list, position):返回list的 position 位置中的item值。
- print(list): 按list中存储的顺序输出list中的所有item,没有空格
如果position信息无效,则在屏幕上输出错误消息“invalid position”,忽略相应的运算。
输入的描述( 参考下面的输入输出例子)
- 每条运算的内容逐条输入,每条运算的种类、位置、项目依次输入。
- 运算的种类:运算名称的最前英文为大写字母(A、D、G、P)。
- 位置:正数
- 项目:英文(大写、小写都可以)
例子1:
输入
5 ↦ 计算的个数: 5 A 1 S ↦ add(list, 1, 'S') A 2 t ↦ add(list, 2, 't') A 3 r ↦ add(list, 3, 'r') A 3 a ↦ add(list, 3, 'a') P ↦ print(list)
输出
Star ↦ 第5次运算(P)输出
输入
9 ↦ 计算的个数: 9 A 1 D ↦ add(list, 1, 'D') A 2 a ↦ add(list, 2, 'a') A 3 y ↦ add(list, 3, 'y') D 1 ↦ delete(list, 1) P ↦ print(list) G 3 ↦ get(list, 3) A 1 S ↦ add(list, 1, 'S') P ↦ print(list) G 3 ↦ get(list, 3) 输出
ay ↦ 第5次运算(P)输出 invalid position ↦ 第6次运算(G 3)的输出 Say ↦ 第8次运算(P)的输出 y ↦ 第9次运算(G 3)的输出
你的难点是啥呢?是哪个操作不会呢
给你说说大概的思路吧
1. 首先是要根据操作码,决定要执行的操作,这个是 switch 或者 if else 也是可以的。
2. 然后具体的操作都是对链表进行操作的,add,就是在链表的任意位置新增一个节点。
3. delete 就是删除链表任意的一个节点
4. get 就是获取任意的节点
5. print 就是打印所有的节点。
// 这个是节点的结构体定义
typedef struct ListNode{
// 节点保存的值
char ch;
// 下一个节点
struct ListNode *next;
};
你要定义一个头节点,然后每次遍历到对应的位置,做相应的操作。遍历的操作如下。
void opA() {
while (i < num, cur.next != null) {
// 创建一个新的节点 new
// 将 pre.next 指向新的节点
// 将 new.next = cur
}
printf("invalid position")
}