小甲鱼 发表于 2017-4-2 04:58:21

已有 23 人购买  本主题需向作者支付 5 鱼币 才能浏览 购买主题

清尘yt 发表于 2019-8-16 11:32:02

本帖最后由 清尘yt 于 2019-8-16 13:45 编辑

//头插法相应操作
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;

Sean_Huang 发表于 2022-3-20 11:20:13

为什么我的代码 输入书名之后回车没有翻译    不会接着打印”请输入作者“这个代码{:10_266:}

李小民 发表于 2022-4-24 09:57:53

为啥高效版尾插法出现段错误

2195445402 发表于 2022-4-24 19:55:44

{:10_269:}{:10_269:}

Puppet16 发表于 2022-5-6 15:42:39

好好学习才能天天向上!

落叶L 发表于 2022-10-4 15:42:40

高效版的静态指针变量不是一个悬空指针吗

Lijfishc@l 发表于 2024-5-17 16:41:18

//不使用指针的指针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]
查看完整版本: S1E46:单链表2