双向链表的问题
- C/C++ code
#include <stdio.h>#include <malloc.h>typedef struct node{ int Data; node *left; node *right;}*Pnode;typedef struct Link{ Pnode Head; int Length;}*PLink;PLink InitLink(){ PLink P=(PLink)malloc(sizeof(Link)); P->Head=(Pnode)malloc(sizeof(node)); P->Head->left=NULL; P->Head->right=NULL; P->Length=0; return P;}void InsertNode(PLink P,int Elem){ Pnode Nnode=(Pnode)malloc(sizeof(node)); Nnode->Data=Elem; Nnode->right=NULL; Pnode H=P->Head; if (!H->right) { P->Head->right=Nnode; Nnode->left=P->Head; } else while(H->right) { H=H->right; } H->right=Nnode; Nnode->left=H; P->Length++;}void ShowLink(PLink P){ Pnode H=P->Head; while (H->right) { printf("%d ",H->right->Data); H->right=H->right->right; } printf("\n");}void ResShow(PLink P)//逆序输出,也有问题。{ Pnode T=P->Head; while (T->right) { T->right=T->right->right; } while (T->left) { printf("%d ",T->left->Data); T->left=T->left->left; }}int main(){ PLink P= InitLink(); for(int i=0;i<=5;i++) { InsertNode(P,i); } printf("%d \n",P->Head->right->Data);//这个可以输出。 ShowLink(P); //printf("%d ",P->Head->right->Data);//这个为什么输出不了? //ResShow(P); getchar(); return 0;}[解决办法]
我没运行过,上面只是防止改变right的值。
不过我觉得正确的写法应该是
void ShowLink(PLink P)
{
Pnode H=P->Head;
while (H->right)
{
printf("%d ",H->right->Data);
H=H->right;
}
printf("\n");
}
[解决办法]
因为 ShowLink(PLink P) 里的while循环最后把P的right变为NULL了,H始终是指向P->Head的,所以改变H必然会改变P。
P的left和right都是NULL,逆序输出的的循环根本没执行。
[解决办法]
问题是像你说的这么出现的,而且最主要的是用 H->right=H->right->right 的话,链表结构就被改变了,遍历完的你都会找不着了,以后free也会出现问题。画个图比划比划就明白了。