不考虑哈希函数,使用strcmp函数进行字符串比较,而不是直接使用==运算符进行比较。
时间: 2024-02-20 19:57:48 浏览: 94
字符串比较函数strcmp()
好的,下面是使用strcmp函数进行字符串比较的代码:
```
struct Book {
char no[20]; // 书号
char name[50]; // 书名
double price; // 价格
};
struct Node {
Book data;
Node* next;
};
typedef Node* LinkList;
void DupRemoval_L(LinkList& L) {
LinkList p = L->next;
LinkList pre = L; // pre指向p的前一个结点,用于删除结点
while (p) {
LinkList q = p->next;
bool flag = false; // flag表示当前书号是否已经出现过
while (q) {
if (strcmp(q->data.no, p->data.no) == 0) { // 如果当前书号已经出现过,删除该结点
pre->next = q;
p->next = q->next;
delete q;
q = p->next;
flag = true;
} else {
pre = q;
q = q->next;
}
}
if (!flag) { // 如果当前书号没有出现过,保留该结点
pre = p;
p = p->next;
} else { // 如果当前书号已经出现过,删除该结点
pre->next = p->next;
delete p;
p = pre->next;
}
}
}
int main() {
int n;
cin >> n;
LinkList L = new Node; // 创建链表
L->next = nullptr;
for (int i = 0; i < n; i++) { // 读入图书信息,加入链表
char no[20], name[50];
double price;
cin >> no >> name >> price;
Book book = {0};
strcpy(book.no, no);
strcpy(book.name, name);
book.price = price;
LinkList p = new Node;
p->data = book;
p->next = L->next;
L->next = p;
}
DupRemoval_L(L); // 去重
int count = 0;
for (LinkList p = L->next; p; p = p->next) { // 遍历链表,输出图书信息
count++;
printf("%s %s %.2f\n", p->data.no, p->data.name, p->data.price);
}
printf("%d\n", count); // 输出去重后的图书数目
return 0;
}
```
注意,在上述代码中,使用了strcmp函数进行字符串比较,如果两个字符串相等,则返回0。同时,对于链表中的重复元素,我们始终保留第一个元素,删除其余的元素。因此,在去重时需要用pre指针来记录当前节点的前一个节点。
阅读全文