搜索单链表
2019-04-06 22:34
52 查看
版权声明:如有侵权,请及时删除,引用请标明出处,联系:2195971474@qq.com https://blog.csdn.net/khqxf/article/details/89061488
搜索单链表
#include<stdio.h> #include<stdlib.h> #include<string.h> void getinput(struct Book *book); void addBook(struct Book **library); void printLibrary(struct Book *library); void printBook(struct Book *book); void releaseLibrary(struct Book **library); struct Book *searchBook(struct Book *library,char *target); struct Book { char title[128]; char author[40]; struct Book *next; }; void getinput(struct Book *book) { printf("\n请输入书名:"); scanf("%s",book->title); //scanf中不要有换行符 printf("\n请输入作者:"); scanf("%s",book->author); } void addBook(struct Book **library) //采用头插法,往链表中插入元素,library作为头指针,两层解引用,因为它是指向结构体指针的指针 { struct Book *book; static struct Book *tail; //定义静态结构体指针,始终指向链表尾部 book = (struct Book *)malloc(sizeof(struct Book)); //为要插入的元素动态申请一块内存空间 if(book == NULL) { printf("内存分配失败!\n"); exit(1); } getinput(book); //获取插入元素的内容 if(*library != NULL) //如果插入的不是NULL链表 { //插入数据 tail->next = book; book->next = NULL; } else { *library = book; book->next = NULL; } tail = book; } void printLibrary(struct Book *library) { struct Book *book; int count = 1; book = library; while(book!=NULL) { printf("\nBook%d:\n",count); printf("\n书名:%s\n",book->title); printf("\n作者:%s\n",book->author); book = book ->next; count++; } } struct Book *searchBook(struct Book *library,char *target) { struct Book *book; book = library; while(book!=NULL) { if(!strcmp(book->title,target)||!strcmp(book->author,target)) //strcmp,相等返回0,意味着匹配到了 { break; } book = book->next; } return book; } void printBook(struct Book *book) { printf("\n书名:%s\n",book->title); printf("\n作者:%s\n",book->author); } void releaseLibrary(struct Book **library) { struct Book *temp; while(*library != NULL) { temp = *library; *library = (*library)->next; //考虑运算符的优先级,->的高于解引用*,故需要加括号。 free(temp); } } int main(void) { struct Book *book; struct Book *library = NULL; char input[128]; int ch; while(1) { printf("\n请问是否需要输入书籍或者作者(Y/N): "); do { ch = getchar(); }while(ch!='Y'&&ch!='N'); if(ch=='Y') { addBook(&library); } else { break; } } printf("\n请问是否需要打印书籍信息(Y/N): "); do { ch = getchar(); }while(ch!='Y'&&ch!='N'); if(ch=='Y') { printLibrary(library); } else { releaseLibrary(&library); } printf("\n请输入书名或者作者:"); scanf("%s",input); book = searchBook(library,input); if(book==NULL) { printf("\n很抱歉,您要找的书没有收录!\n"); } else { do { printf("\n已找到符合条件的图书...\n"); printBook(book); }while(searchBook(book->next,input)!=NULL); } return 0; }
演示结果:
相关文章推荐
- CF 653E(Bear and Forgotten Tree 2-链表优化搜索)
- [LeetCode] 从排序的单链表到平衡搜索二叉树
- 单向链表存储方式下插入、删除、搜索
- 邻接矩阵,邻接链表DFS深度优先搜索C语言
- 将单向链表reverse,如ABCD变成DCBA,只能搜索链表一次。
- 单向链表存储方式下插入、删除、搜索
- BST(搜索二叉树)与双向链表相互转换
- 基于邻接链表的图的广度优先搜索Java实现
- 搜索二叉树转化为双向链表
- 单向链表存储方式下插入、删除、搜索
- 数据结构复习之二叉树:遍历、搜索节点&路径、查找、与单链表互转、逐层打印
- 简单实现双向链表的初始化 插入 搜索 删除元素
- 有序链表转二叉平衡搜索树(BST)
- CodeForces-920E Connected Components? 广度搜索 双向链表 判断联通 大量重复节点的删除
- 搜索二叉树转换为双向链表
- 二叉树经典面试题2~将搜索二叉树转化为双向链表
- 面试题:搜索二叉树转双向链表
- 将搜索二叉树转换成双向链表
- 如何搜索邮件链表中的信息
- 思考题10-3搜索已排序的紧凑链表