#include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 引入 stdbool.h 使用 true/false #include <string.h> typedef struct LNode { // 定义双链表结点 int data; struct LNode *prior; struct LNode *next; } LNode, *Linklist; // 交换两个节点的数据域 void exchange(Linklist p, Linklist q) { if (!p || !q) return; // 确保传入非空指针 int temp = p->data; p->data = q->data; q->data = temp; } // 将字符串转换为整数数组 int parse_input(const char* input_str, int max_len, int* array) { int length = 0; const char* token = strtok(input_str, " ,\t\n"); // 分隔符包括空格、逗号、制表符和换行符 while (token != NULL && length < max_len) { if (strcmp(token, "9999") == 0) break; // 遇到终止符停止处理 array[length++] = atoi(token); // 转换为整数并存储 token = strtok(NULL, " ,\t\n"); } return length; } int main() { int k = 0, length = 0; Linklist head = (LNode *)malloc(sizeof(LNode)); // 创建头节点 head->next = NULL; // 单向初始化 head->prior = NULL; Linklist p = head, append, rear = head; // 指针用于操作 // 示例输入字符串模拟键盘输入(可以根据需求动态修改) char input_string[256]; printf("请输入链表元素(以空格分隔数字),示例: '1 2 3 4': "); fgets(input_string, sizeof(input_string), stdin); // 解析输入字符串为数组 int buffer[9]; // 最大容量设为8+1 length = parse_input(input_string, 9, buffer); for (int i = 0; i < length; ++i) { k = buffer[i]; if (length > 0) { append = (Linklist)malloc(sizeof(LNode)); append->data = k; if (head->next == NULL) { head->next = append; append->prior = head; } else { rear->next = append; append->prior = rear; } append->next = NULL; rear = append; } } if (length > 1) { printf("当前列表内容:\n"); for (p = head->next; p != NULL; p = p->next) printf("%d ", p->data); puts(""); bool validInput = false; // 添加标志位判断是否已获得合法输入 int index_choice; do { printf("请输入要交换位置处第一个索引值(from 1~%d):\n", length); fgets(input_string, sizeof(input_string), stdin); // 获取索引起始值 index_choice = atoi(input_string); if ((index_choice <= 0) || (index_choice > length)) { puts("无效输入,请重试!"); } else { validInput = true; // 如果输入合法,则退出循环 } } while (!validInput); // 循环直到输入合法 /* 找到对应位置 */ p = head; for (int i = 0; i < index_choice; i++) p = p->next; // 确保不是头部且合法地寻找其前面那个节点作为另一个参与数据互换者. if (p && p->prior) { exchange(p, p->prior); // 打印结果展示效果变化情况下的新状态 printf("经过一次相邻两项之间 value 交互之后得到的新序列形式表现为如下样子:\n"); for (p = head->next; p != NULL; p = p->next) printf("%d ", p->data); } } return 0; // 正常返回主函数 } 不使用strtok完成代码任务,请重新生成代码,要求不能使用scanf sscanf strtok
时间: 2025-06-26 20:05:20 浏览: 16
下面是基于您提供的原始代码的功能描述,重新实现的一个版本。该版本通过手动解析字符输入的方式替代了`strtok`函数,并实现了同样的功能。
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> // 引入 stdbool.h 使用 true/false
typedef struct LNode { // 定义双链表结点
int data;
struct LNode *prior;
struct LNode *next;
} LNode, *Linklist;
// 交换两个节点的数据域
void exchange(Linklist p, Linklist q) {
if (!p || !q) return; // 确保传入非空指针
int temp = p->data;
p->data = q->data;
q->data = temp;
}
// 手动解析字符串为整数数组,避免使用 strtok
int manual_parse_input(const char* input_str, int max_len, int* array) {
int length = 0;
int num = 0;
bool in_number = false;
for (size_t i = 0; input_str[i] != '\0'; ++i) {
char c = input_str[i];
if (c >= '0' && c <= '9') { // 当前字符是数字的一部分
num = num * 10 + (c - '0');
in_number = true;
} else if (in_number) { // 非数字并且之前正在读取一个数字
if (num == 9999) break; // 终止符处理
if (length < max_len) {
array[length++] = num;
}
num = 0;
in_number = false;
}
}
if (in_number && length < max_len) { // 若最后一个数字未加入
array[length++] = num;
}
return length;
}
int main() {
int k = 0, length = 0;
Linklist head = (LNode *)malloc(sizeof(LNode)); // 创建头节点
head->next = NULL; // 单向初始化
head->prior = NULL;
Linklist p = head, append, rear = head; // 指针用于操作
// 示例输入字符串模拟键盘输入(可以根据需求动态修改)
char input_string[256];
printf("请输入链表元素(以空格分隔数字),示例: '1 2 3 4': ");
fgets(input_string, sizeof(input_string), stdin);
// 解析输入字符串为数组
int buffer[9]; // 最大容量设为8+1
length = manual_parse_input(input_string, 9, buffer);
for (int i = 0; i < length; ++i) {
k = buffer[i];
if (length > 0) {
append = (Linklist)malloc(sizeof(LNode));
append->data = k;
if (head->next == NULL) {
head->next = append;
append->prior = head;
} else {
rear->next = append;
append->prior = rear;
}
append->next = NULL;
rear = append;
}
}
if (length > 1) {
printf("当前列表内容:\n");
for (p = head->next; p != NULL; p = p->next)
printf("%d ", p->data);
puts("");
bool validInput = false; // 添加标志位判断是否已获得合法输入
int index_choice;
do {
printf("请输入要交换位置处第一个索引值(from 1~%d):\n", length);
fgets(input_string, sizeof(input_string), stdin); // 获取索引起始值
index_choice = atoi(input_string);
if ((index_choice <= 0) || (index_choice > length)) {
puts("无效输入,请重试!");
} else {
validInput = true; // 如果输入合法,则退出循环
}
} while (!validInput); // 循环直到输入合法
/* 找到对应位置 */
p = head;
for (int i = 0; i < index_choice; i++) p = p->next;
// 确保不是头部且合法地寻找其前面那个节点作为另一个参与数据互换者.
if (p && p->prior) {
exchange(p, p->prior);
// 打印结果展示效果变化情况下的新状态
printf("经过一次相邻两项之间 value 交互之后得到的新序列形式表现为如下样子:\n");
for (p = head->next; p != NULL; p = p->next) printf("%d ", p->data);
}
}
return 0; // 正常返回主函数
}
```
### 修改说明:
上述代码的核心改动在于替换掉了 `parse_input()` 函数中的 `strtok` 调用部分,改为纯手工逐字解析输入字符串中的数值信息。这种做法可以更清晰地控制对每个字符的解读过程而不依赖外部库函数的帮助。
阅读全文
相关推荐



















