gpt4 book ai didi

c - 链表困惑

转载 作者:行者123 更新时间:2023-11-30 19:24:13 24 4
gpt4 key购买 nike

过去几天我一直在看这本书的同一部分,似乎无法弄清楚这个链表/结构的字段是如何变化的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dvdTracker.h"


/**************************************************> main <*/
int main (int argc, const char * argv[]) {
char command;

gHeadPtr = NULL;
gTailPtr = NULL;

while ( (command = GetCommand() ) != 'q' ) {
switch( command ) {
case 'n':
AddToList( ReadStruct() );
break;
case 'l':
ListDVDs();
break;
}
}

printf( "Goodbye..." );

return 0;
}


/*******************************************> GetCommand <*/
char GetCommand( void )
{
char command;

do {
printf( "Enter command (q=quit, n=new, l=list): " );
scanf( "%c", &command );
Flush();
}
while ( (command != 'q') && (command != 'n')
&& (command != 'l') );

printf( "\n----------\n" );
return( command );
}


/*******************************************> ReadStruct <*/
struct DVDInfo *ReadStruct( void ) {
struct DVDInfo *infoPtr;
int num;

infoPtr = (struct DVDInfo *)malloc( sizeof( struct DVDInfo ) );

if ( NULL == infoPtr ) {
printf( "Out of memory!!! Goodbye!\n" );
exit( 0 );
}

printf( "Enter DVD Title: " );
fgets( infoPtr->title, kMaxTitleLength, stdin );
ReplaceReturnAtEndOfString( infoPtr->title );

printf( "Enter DVD Comment: " );
fgets( infoPtr->comment, kMaxCommentLength, stdin );
ReplaceReturnAtEndOfString( infoPtr->comment );

do {
num = 0;
printf( "Enter DVD Rating (1-10): " );
scanf( "%d", &num );
Flush();
}
while ( ( num < 1 ) || ( num > 10 ) );

infoPtr->rating = num;

printf( "\n----------\n" );

return( infoPtr );
}


/*******************************************> AddToList <*/
void AddToList( struct DVDInfo *curPtr ) {
if ( NULL == gHeadPtr )
gHeadPtr = curPtr;
else
gTailPtr->next = curPtr;

gTailPtr = curPtr;
curPtr->next = NULL;
}


/*******************************************> ListDVDs <*/
void ListDVDs( void ) {
struct DVDInfo *curPtr;

if ( NULL == gHeadPtr ) {
printf( "No DVDs have been entered yet...\n" );
printf( "\n----------\n" );
} else {
for ( curPtr=gHeadPtr; curPtr!=NULL; curPtr = curPtr->next ) {
printf( "Title: %s\n", curPtr->title );
printf( "Comment: %s\n", curPtr->comment );
printf( "Rating: %d\n", curPtr->rating );

printf( "\n----------\n" );
}
}
}

当我调试这个程序时,在该行:

gTailPtr->next=curPtr;

gHeadPtr->next 也指向当前指针,但我不知道如何指向。

这是来自在 Mac 上学习 C (Addison) 第 256 页,如果有人可以提供帮助,谢谢!或者至少解释一下。

最佳答案

如果是插入到列表中的第二个项目,则 gTailPtrgHeadPtr 最初将指向同一节点(列表中的第一个也是唯一的节点) )。因此,此时,gTailPtr->nextgHeadPtr->next 只是同一对象的两个名称。

要理解的关键是 gHeadPtr 本身不是节点,并且根本不包含 next 字段。它只是一个指向节点的指针:这意味着它包含的是对某个节点(或根本没有节点)的引用。当您分配给 gHeadPtr 本身时,您正在更改它指向的节点。当您使用 -> 运算符时,您正在检查它现在指向的节点。

可以这样想:指针变量就像一张纸片,上面可以写有电话号码。当您更改指针变量时,这就像删除电话号码并用其他号码替换一样;当您使用 -> 运算符时,这就像调用电话号码一样。指向同一个节点的两个指针变量就像两张纸上写着相同的电话号码:无论你用哪一张打电话,都会到达相同的目的地。 NULL 指针是一张白纸:尝试调用该数字没有任何意义。

关于c - 链表困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com