算法2-1 在顺序表 list 中查找元素 x
分数 10
作者 陈越
单位 浙江大学
请编写程序,将 n 个整数存入顺序表,对任一给定整数 x,查找其在顺序表中的位置。
输入格式:
输入首先在第一行给出正整数 n(≤104);随后一行给出 n 个 int 范围内的不重复的整数,数字间以空格分隔;最后一行给出待查找的元素 x,也是 int 范围内的整数。
输出格式:
在一行中输出 x 在顺序表中的位置,即数组下标。如果没找到,则输出 -1。注意数组下标从 0 开始。
输入样例 1:
输出样例 1:
输入样例 2:
输出样例 2:
解析(按课本)
#include <iostream> #include <cstdlib> using namespace std; #define MAXSIZE 10000 typedef int ElemType; typedef ElemType * list; typedef struct { ElemType * elem; int length; int listsize; }SqList;
int main() { int n; cin >> n; SqList L; L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType)); L.length = n; L.listsize = MAXSIZE; for(int i = 0; i < n; i++) cin >> L.elem[i]; int k; cin >> k; for(int i = 0; i < L.length; i++) { if(L.elem[i] == k) { cout << i << endl; return 0; } } cout << -1; return 0; }
|
算法2-2 在顺序表 list 的第 i 个位置上插入元素 x
分数 15
作者 陈越
单位 浙江大学
请编写程序,将 n 个整数存入顺序表,对任一给定整数 x,将其插入顺序表中指定的第 i 个位置。注意:i 代表位序,从 1 开始,不是数组下标。
输入格式:
输入首先在第一行给出正整数 n(≤104);随后一行给出 n 个 int 范围内的整数,数字间以空格分隔;最后一行给出插入位置 i 和待插入的元素 x,均为 int 范围内的整数。
输出格式:
分以下几种情况输出:
- 如果顺序表中已经有 104 个元素了,则不能插入,在一行中输出句子
错误:表满不能插入。。
- 如果插入的位置不合法,则不能插入,在一行中输出句子
错误:插入位置不合法。。
- 无论是否插入成功,都在一行中顺序输出表中的元素,每个元素后面跟一个空格。
输入样例 1:
输出样例 1:
输入样例 2:
输出样例 2:
解析(按课本)
#include <iostream> #include <cstdlib> using namespace std; #define MAXSIZE 10000 typedef int ElemType; typedef ElemType * list; typedef struct { ElemType * elem; int length; int listsize; }SqList; int main() { SqList L; L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType)); int n; cin >> n; L.length = n; L.listsize = MAXSIZE; for(int i = 0; i < n; i++) cin >> L.elem[i]; int a, b; cin >> a >> b; if(a < 1 || a > L.length + 1) { cout << "错误:插入位置不合法。" << endl; } else if(L.length >= L.listsize) { cout << "错误:表满不能插入。" << endl; } else { for(int i = L.length - 1; i >= a - 1; i--) L.elem[i + 1] = L.elem[i]; L.elem[a - 1] = b; L.length++; } for(int i = 0; i < L.length; i++) cout << L.elem[i] << " "; return 0; }
|
算法2-3 从顺序表 list 中删除第 i 个元素
分数 15
作者 陈越
单位 浙江大学
请编写程序,将 n 个整数存入顺序表,对任一指定的第 i 个位置,将这个位置上的元素从顺序表中删除。注意:i 代表位序,从 1 开始,不是数组下标。
输入格式:
输入首先在第一行给出正整数 n(≤104);随后一行给出 n 个 int 范围内的整数,数字间以空格分隔;最后一行给出删除位序 i,为 int 范围内的整数。
输出格式:
如果删除的位置不合法,则不能删除,在一行中输出句子 错误:不存在这个元素。。无论是否删除成功,都在一行中顺序输出表中的元素,每个元素后面跟一个空格。
输入样例 1:
输出样例 1:
输入样例 2:
输出样例 2:
解析(按课本)
#include <iostream> using namespace std; #define MAXSIZE 10000 typedef int ElemType; typedef ElemType * list; typedef struct { ElemType * elem; int length; int listsize; }SqList; int main() { SqList L; L.elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType)); int n; cin >> n; L.length = n; L.listsize = MAXSIZE; for(int i = 0; i < n; i++) cin >> L.elem[i]; int k; cin >> k; if(k < 1 || k > L.length) cout << "错误:不存在这个元素。" << endl; else { for(int i = k; i < L.length; i++) L.elem[i - 1] = L.elem[i]; L.length--; } for(int i = 0; i < L.length; i++) cout << L.elem[i] << " "; return 0; }
|
算法2-4 求单链表list中的元素个数,即表长
分数 15
作者 陈越
单位 浙江大学
请编写程序,将 n 个整数顺次插入一个初始为空的单链表的表头。最后输出单链表的表长。
本题旨在训练学习者熟悉单链表的基本操作,不建议直接输出 n。
输入格式:
输入首先在第一行给出非负整数 n(≤15);随后一行给出 n 个 int 范围内的整数,数字间以空格分隔。
输出格式:
在一行中输出单链表的表长。
输入样例:
输出样例:
解析
#include <iostream> #include <cstdlib> using namespace std; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList;
int main() { LinkList head = (LinkList)malloc(sizeof(LNode)); head->next = NULL;
int n; cin >> n;
for (int i = 0; i < n; i++) { LinkList p = (LinkList)malloc(sizeof(LNode)); cin >> p->data; p->next = head->next; head->next = p; }
int count = 0; LinkList p = head->next; while (p) { count++; p = p->next; } cout << count << endl; return 0; }
|
注意
创建了一个头节点,避免了插入时判断 “链表是否为空” 的麻烦(无论链表是否有有效节点,插入逻辑都一致),是单链表的常用优化写法