本帖最后由 科科都不挂 于 2020-8-12 12:55 编辑
这是C语言S1E46单链表2课上的例题:
#include <stdio.h>
#include <stdlib.h>
void addBook(struct Book **library);
void printLibrary (struct Book *library);
void releaseLibrary(struct Book **library);
struct Book
{
char title[128];
char author[40];
struct Book *next;
};
void getinput(struct Book *book);
void getinput(struct Book *book)
{
printf ("请输入书名:");
scanf ("%s", book->title);
printf ("请输入作者:");
scanf ("%s", book->author);
}
void addBook(struct Book **library) //在这里为什么两个*,即指向指针的指针。因为你要修改的是指针的值,所以你要找到它的地址。
{
struct Book *book, *temp;
book = (struct Book *)malloc(sizeof(struct Book *)); //待插入的项
if (book == NULL)
{
printf ("很遗憾,内存失败了!\n");
exit(1);
}
getinput(book);
if (*library == NULL) //如果原来的头没有数据
{
*library = book;
book->next = NULL;
}
else
{
temp = *library; //将temp指向头指针
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = book;
book->next = NULL; //book后面的地址指向NULL
}
}
void printLibrary (struct Book *library)
{
struct Book *book;
int count = 1;
book = library;
while (book != NULL)
{
printf ("Book%d: ", count);
printf ("书名:%s ", book->title);
printf ("作者:%s\n", book->author);
book = book->next; //类似于 *i++ ,指向下一个结构体
count++;
}
}
void releaseLibrary(struct Book **library)
{
struct Book *temp;
while (*library != NULL)
{
temp = *library;
*library = (*library)->next; //因为这里我们需要修改指针所指向的地址,所以要从指针的地址下手
free(temp);
}
}
int main(void)
{
struct Book *library = NULL; //*library就是头号元素
char ch;
while (1)
{
printf ("请问是否需要录入图书信息:");
do
{
ch = getchar();
}while (ch != 'Y' && ch != 'N');
if (ch == 'N')
{
break;
}
if (ch == 'Y')
{
addBook (&library);
}
}
printf ("请问是否需要打印图书信息:");
do
{
ch = getchar();
}while (ch != 'Y' && ch != 'N');
if (ch == 'Y')
{
printLibrary(library);
}
releaseLibrary(&library); // 清除内存
return 0;
}
在这个代码中,我不解的是,我将addBook函数中的部分代码修改了一下,但是结果却截然不同。检查了好几遍,我感觉逻辑上也过得去,语法也没错。希望各位帮帮忙!!! temp = *library; //将temp指向头指针
while (temp != NULL) //验证temp的第一个值是不是NULL
{
temp = temp->next; //如果不是NULL,则给他指向下一个值的地址
}
temp = book; //将NULL的地址指向新书
book->next = NULL; //book后面的地址指向NULL
其它代码与原代码完全一致,唯独改了三处。将temp->next 改为了temp.
temp->next=NULL时循环退出,此时是最后一个元素,然后把最后一个元素的指针域指向book这一个节点,这个节点不为NULL,然后再把book->next的指针域初始化为NULL,
你自己写的是当temp->next=NULL时你没有把这个指针去指向新添加的书籍,反而让temp = NULL,也就是一个一个未初始化新的节点,上一本书的指针域并没有指向新添加的书籍,这就导致你的链表永远只有一本书,
|