读书人

双向链表的有关问题

发布时间: 2012-04-14 17:14:21 作者: rapoo

双向链表的问题

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也会出现问题。画个图比划比划就明白了。

读书人网 >C++

热点推荐