读书人

。链表有关问题

发布时间: 2012-03-06 20:47:55 作者: rapoo

求助。。。链表问题
这是将链表hc:a1,b1,a2,b2...an,bn拆分为ha:a1,a2...an和hb:b1,b2...bn的算法。vc6.0编译出错,好象是内存分配问题,实在是找不出哪里不对。。注释掉p=p->next;和最后的ra->next=rb->next=NULL;两句就不出错了。

C/C++ code
void split(linklist* hc,linklist* &ha,linklist* &hb){       linklist *p,*ra,*rb;    p=hc->next;    ha=hc;    ra=ha;    hb=(linklist*)malloc(sizeof(linklist));    rb=hb;    while(p){        ra->next=p;        ra=p;        p=p->next;        rb->next=p;        rb=p;        p=p->next;    }    ra->next=rb->next=NULL;}

完整代码
C/C++ code
#include <stdio.h>#include <malloc.h>typedef struct Lnode{    int data;    struct Lnode *next;}linklist;void create_TOU(linklist *&L,int r[],int length){    linklist *newnode;    L=(linklist*)malloc(sizeof(linklist));        L->data=length;    L->next=NULL;    for(int i=0;i<length;i++){        newnode=(linklist*)malloc(sizeof(linklist));        newnode->data=r[i];        newnode->next=NULL;        newnode->next=L->next;        L->next=newnode;    }}void printL(linklist *L){    printf("The value is: ");    L=L->next;    while(L->next!=NULL){        printf("%d->",L->data);        L=L->next;    }    printf("%d\n",L->data);}void split(linklist* hc,linklist* &ha,linklist* &hb){   //二、8    linklist *p,*ra,*rb;    p=hc->next;    ha=hc;    ra=ha;    hb=(linklist*)malloc(sizeof(linklist));    rb=hb;    while(p){        ra->next=p;        ra=p;        p=p->next;        rb->next=p;        rb=p;        p=p->next;    }    ra->next=rb->next=NULL;}int main(){    int r[]={45,89,33,12,59,879,6};    int length=sizeof(r)/sizeof(r[0]);    linklist* myL;    create_TOU(myL,r,length);    printL(myL);    /*------------二、8--------*/    linklist *ha,*hb;    split(myL,ha,hb);    printL(ha);    printL(hb);    /*--------------------------*/    return 0;}


[解决办法]
while(p)
{
ra->next=p;
ra=p;
p=p->next;
rb->next=p;
rb=p;
p=p->next;
}
这一段执行后P会连续向后移两个位置,在第一次移动后你没有判断P的有效性,如果指向了空,第二次就异常了。

我读了这段代码,没明白你要做的到底是什么?请明确一下要实现的功能!!!
[解决办法]
改好了
C/C++ code
void split(linklist* hc,linklist* &ha,linklist* &hb){   //二、8    linklist *p,*ra,*rb;    p=hc->next;    ha=hc;    ra=ha;    hb=(linklist*)malloc(sizeof(linklist));    rb=hb;    while(p){        ra->next = p;        ra=p;        p=p->next;        if(p)    //加上这个判断        {            rb->next=p;            rb=p;            p=p->next;        }    }    ra->next=rb->next=NULL;} 

读书人网 >C语言

热点推荐