//头插法相应操作
if(*library!=NULL) //单链表头插法的两种情况,相应的操作
{
temp=*library;
*library=book;
book->next=temp;
}
else
{
*library=book;
book->next=NULL;
}
//尾插法相应的操作 每次调用函数都循环遍历找到尾指针效率很低,推荐用指针存储每次调用后的 尾部位置!!!1
if(*library==NULL)
{
*library=book;
book->next=NULL;
}
else
{//设置一个中转变量,并循环遍历单链表直至找到 最后一个节点结束,所以temp此时存储的是最后一个节点地址
temp=*library;
while(temp->next!=NULL)
{
temp=temp->next;
}
temp->next=book;
book->next=NULL;
}
//高效版,用尾指针存储每次添加书籍之后的位置,所以定义一个尾指针tail来存储单链表尾部的地址。
static struct Book *tail;//这里很关键,必须是static类型的,不没有的话会造成每一次调用add函数时,tail重新初始化了。
……
if(*library==NULL)
{
*library=book;
book->next=NULL;
}
else
{
tail->next=book;
book->next=NULL;
}
tail=book;
为什么我的代码 输入书名之后回车没有翻译 不会接着打印”请输入作者“这个代码{:10_266:} 为啥高效版尾插法出现段错误
{:10_269:}{:10_269:} 好好学习才能天天向上! 高效版的静态指针变量不是一个悬空指针吗 //不使用指针的指针demo(样例),未加释放内存函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book {
char title;
char author;
struct Book *next;
};
void addBook(struct Book *plibrary);
void getBook(struct Book *newBook);
void printLibrary(struct Book *plibrary);
struct Book *searchBook(struct Book *plibrary, char *target);
void printBook(struct Book *pbook);
void getBook(struct Book *newBook) {
newBook->next = NULL;
printf("请输入书籍的名称:");
scanf("%s", newBook->title);
printf("请输入书籍的作者:");
scanf("%s", newBook->author);
}
void addBook(struct Book *plibrary) {
static struct Book *temp;
struct Book *newBook;
newBook = (struct Book *)malloc(sizeof(struct Book));
if (newBook == NULL) {
printf("内存分配失败了");
exit(1);
} else {
getBook(newBook);
if (plibrary->next != NULL) {
temp->next = newBook;
} else {
plibrary->next = newBook;
}
temp = newBook;
}
}
void printLibrary(struct Book *plibrary) {
struct Book *link;
link = plibrary;
int count = 1;
while (link->next != NULL) {
link = link->next;
printf("第%d本书籍信息\n", count);
printf("%s\n", link->title);
printf("%s\n", link->author);
count++;
}
}
struct Book *searchBook(struct Book *plibrary, char *target) {
struct Book *book;
book = plibrary->next;
while (book != NULL) {
if (!strcmp(book->title, target) || !strcmp(book->author, target)) {
break;
}
book = book->next;
}
return book;
}
void printBook(struct Book *pbook) {
printf("书名:%s\n", pbook->title);
printf("作者:%s\n", pbook->author);
}
int main() {
static struct Book library;
library.next = NULL;
struct Book *book;
char target;
int ch;
while (1) {
printf("请问是否需要录入书籍:(y/n)");
do {
ch = getchar();
} while (ch != 'y' && ch != 'n');
if (ch == 'y') {
addBook(&library);
} else {
break;
}
}
printf("请问是否需要打印书籍信息(y/n)");
do {
ch = getchar();
} while (ch != 'y' && ch != 'n');
if (ch == 'y') {
printLibrary(&library);
}
while (1) {
printf("请问是否需要查找书籍:(y/n)");
do {
ch = getchar();
} while (ch != 'y' && ch != 'n');
if (ch == 'y') {
printf("请输入您要查找的书籍名称或者作者姓名:");
scanf("%s", target);
book = searchBook(&library, target);
if (book == NULL) {
printf("很抱歉,没有找到符合条件的书籍...\n");
} else {
do {
printf("已找到符合条件的书籍:\n");
printBook(book);
} while ((book = searchBook(book, target)) != NULL);
}
} else {
break;
}
}
return 0;
}
页:
[1]