35、从有序顺序表中删除所有其值重复的元素,使表中元素不重复。
思路
本算法使用了一贯的手法,利用{``}来限制输入元素的范围,使用字符串依次读入所有的内容,使用strtok方法和atoi方法来对字符串中的数字进行获取,读入到num数组中。因为是有序表,所以只需要判断上一个和下一个数字是否相同即可,若相同,则跳过,若不同,则将值赋给相应的位置,同时输出即可。
具体实现
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
int main() {
char str[MAX_LEN];
int num[MAX_LEN];
int n, i, j=0, count=0;
// 将输入的内容按照字符串读入
scanf("%s", str);
// 读取字符串中不含‘{’‘}’的内容
for (i = 0; str[i] != '}'; i++) {
if (str[i] != '{') {
str[j++] = str[i];
}
}
str[j] = '\0'; // 确保新字符串以 '\0' 结尾
// 分割字符串并转换为数字
i=0;
char *token = strtok(str, ",");
while (token != NULL) {
num[i++] = atoi(token);
token = strtok(NULL, ",");
}
for(j = 0; j < i; j++) {
if(num[j] != num[j+1]) {
num[count] = num[j];
printf("%d ", num[count]);
count++;
}
}
return 0;
}
36、将两个有序表合并成一个新的有序表。
思路
数组的输入思路与上算法一个类似,只不过做成了自定义方法形式,因为都是有序表,所以在进行合并的时候,只需要判断当前的是那个一个更小(我写的升序合并)将其放入发哦一个新数组中即可。
具体实现
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 100
#define MAX_NUM 100000
int createNum(int num[]) {
char str[MAX_LEN];
int n, i, j=0;
// 将输入的内容按照字符串读入
scanf("%s", str);
// 读取字符串中不含‘{’‘}’的内容
for (i = 0; str[i] != '}'; i++) {
if (str[i] != '{') {
str[j++] = str[i];
}
}
str[j] = '\0'; // 确保新字符串以 '\0' 结尾
// 分割字符串并转换为数字
i=0;
char *token = strtok(str, ",");
while (token != NULL) {
num[i++] = atoi(token);
token = strtok(NULL, ",");
}
return i;
}
int main() {
int num1[MAX_LEN], num2[MAX_LEN], num[2*MAX_LEN], n1, n2;
n1 = createNum(num1);
n2 = createNum(num2);
int i=0, j=0, k=0;
while(i < n1 || j < n2) {
if(num1[i] < num2[j] && i != n1) {
num[k] = num1[i];
i++;
} else if(j != n2) {
num[k] = num2[j];
j++;
}
printf("%d ", num[k]);
k++;
}
return 0;
}
小结
本次算法不算很难,主要是对数组的运用以及处理,怎样用最方便的办法来实现算法所需要的功能值得我们思考。