用c语言表示基于链式结构的图书信息表的图书去重
时间: 2023-04-08 07:02:34 浏览: 143
可以使用哈希表来实现基于链式结构的图书信息表的图书去重。具体实现方法如下:
1. 定义一个结构体 Book,包含图书的各种信息,如书名、作者、出版社、ISBN 码等。
2. 定义一个哈希表,用来存储图书信息。哈希表的每个元素是一个链表,用来存储哈希值相同的图书信息。
3. 对于每个要插入的图书信息,先计算其哈希值,然后将其插入到对应的链表中。
4. 在插入之前,先遍历对应的链表,查找是否已经存在相同的图书信息。如果存在,则不插入;否则,将其插入到链表的末尾。
5. 对于查询操作,同样先计算图书信息的哈希值,然后在对应的链表中查找是否存在相同的图书信息。
下面是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BOOKS 1000
#define HASH_SIZE 997
typedef struct Book {
char title[100];
char author[50];
char publisher[50];
char isbn[20];
} Book;
typedef struct ListNode {
Book book;
struct ListNode *next;
} ListNode;
ListNode *hashTable[HASH_SIZE];
unsigned int hash(char *str) {
unsigned int hashval = 0;
for (; *str != '\0'; str++) {
hashval = *str + 31 * hashval;
}
return hashval % HASH_SIZE;
}
void insertBook(Book book) {
unsigned int hashval = hash(book.isbn);
ListNode *node = hashTable[hashval];
while (node != NULL) {
if (strcmp(node->book.isbn, book.isbn) == 0) {
return;
}
node = node->next;
}
node = (ListNode *) malloc(sizeof(ListNode));
node->book = book;
node->next = hashTable[hashval];
hashTable[hashval] = node;
}
Book *findBook(char *isbn) {
unsigned int hashval = hash(isbn);
ListNode *node = hashTable[hashval];
while (node != NULL) {
if (strcmp(node->book.isbn, isbn) == 0) {
return &node->book;
}
node = node->next;
}
return NULL;
}
int main() {
int n;
Book books[MAX_BOOKS];
printf("请输入图书数量:");
scanf("%d", &n);
printf("请依次输入每本图书的信息(书名 作者 出版社 ISBN 码):\n");
for (int i = 0; i < n; i++) {
scanf("%s %s %s %s", books[i].title, books[i].author, books[i].publisher, books[i].isbn);
insertBook(books[i]);
}
printf("请输入要查询的图书的 ISBN 码:");
char isbn[20];
scanf("%s", isbn);
Book *book = findBook(isbn);
if (book != NULL) {
printf("查询结果:\n");
printf("书名:%s\n", book->title);
printf("作者:%s\n", book->author);
printf("出版社:%s\n", book->publisher);
printf("ISBN 码:%s\n", book->isbn);
} else {
printf("未找到该图书!\n");
}
return 0;
}
```
阅读全文