用C语言设计:设s和t是表示成单链表的两个串,试编写一个找出s中第1个不在t中出现的字符(假定每个结点只存放一个字符)的算法。
时间: 2024-01-22 07:21:20 浏览: 79
以下是一种基于哈希表的实现方法:
1. 新建一个哈希表,用于存储t中出现的字符;
2. 遍历s中的每个字符,如果该字符不在哈希表中,则返回该字符,否则继续遍历;
3. 如果遍历完s后仍未找到符合条件的字符,则返回空字符。
下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000
typedef struct Node {
char data;
struct Node *next;
} ListNode, *LinkedList;
LinkedList createList(char *s) {
LinkedList L = (LinkedList) malloc(sizeof(ListNode));
L->next = NULL;
ListNode *p = L;
while (*s) {
ListNode *node = (ListNode *) malloc(sizeof(ListNode));
node->data = *s++;
node->next = NULL;
p->next = node;
p = node;
}
return L;
}
char findFirstChar(LinkedList s, LinkedList t) {
int hash[MAXSIZE] = {0}; // 哈希表
ListNode *p = t->next;
while (p) { // 将t中的字符加入哈希表
hash[p->data]++;
p = p->next;
}
p = s->next;
while (p) { // 在s中查找第一个不在t中出现的字符
if (!hash[p->data]) {
return p->data;
}
p = p->next;
}
return '\0';
}
int main() {
char *s = "hello world";
char *t = "world";
LinkedList Ls = createList(s);
LinkedList Lt = createList(t);
char c = findFirstChar(Ls, Lt);
if (c != '\0') {
printf("The first character in s that does not appear in t is: %c\n", c);
} else {
printf("No such character found.\n");
}
return 0;
}
```
注意:该实现方法假定字符集大小不超过哈希表的最大容量 MAXSIZE,如果字符集过大,需要考虑使用其他数据结构或算法。
阅读全文