鱼C论坛

 找回密码
 立即注册
查看: 4752|回复: 7

[知识点备忘] S1E46:单链表2

[复制链接]
发表于 2017-4-2 04:58:21 | 显示全部楼层 |阅读模式
购买主题 已有 21 人购买  本主题需向作者支付 5 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 7 反对 0

使用道具 举报

发表于 2022-3-20 11:20:13 | 显示全部楼层
为什么我的代码 输入书名之后回车没有翻译    不会接着打印”请输入作者“这个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 09:57:53 | 显示全部楼层
为啥高效版尾插法出现段错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-24 19:55:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-6 15:42:39 | 显示全部楼层
好好学习才能天天向上!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 15:42:40 From FishC Mobile | 显示全部楼层
高效版的静态指针变量不是一个悬空指针吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-17 16:41:18 | 显示全部楼层
//不使用指针的指针demo(样例),未加释放内存函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Book {
        char title[128];
        char author[40];
        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[128];
        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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 14:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表