数据结构链串——字串的替换,不懂的地方

数据结构链串——字串的替换,不懂的地方


 LinkStrNode *RepStr(LinkStrNode *s,int i,int j,LinkStrNode *t)    //串替换
{
    int k;
    LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next=NULL;
    r=str;                            
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
        return str;                     
    for (k=0;k1;k++)              
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p->data;q->next=NULL;    //为什么这里q->next=NULL?
        r->next=q;r=q;
        p=p->next;
    }
    for (k=0;kp=p->next;
    while (p1!=NULL)                
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p1->data;q->next=NULL;   //为什么这里q->next=NULL?
        r->next=q;r=q;
        p1=p1->next;
    }
    while (p!=NULL)                    
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p->data;q->next=NULL;   //为什么这里q->next=NULL?
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}

我的问题就是为什么字串的替换q->next=NULL?我觉得这句省略了也是可以的啊,而且字串的插入、求子串都没有这句,所以每次都把s链串不用删除的结点放入str链串中,每次为什么q的next又要置NULL?想不通这点,希望大家能指点指点。

如果q是尾节点,你就必须将其next设置为NULL

你把这句话删了再执行,看是不是跑飞了,出野指针了?
q一开始是新节点,然后把它当做尾节点链在最后
如果next不设置成null
那while循环的时候没有一个节点的next会是null,不就一直循环下去,一直跑进野指针里

数据结构链串——串插入


LinkStrNode *InsStr(LinkStrNode *s,int i,LinkStrNode *t)        //串插入
{
    int k;
    LinkStrNode *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next=NULL;
    r=str;                                //r指向新建链表的尾结点
    if (i<=0 || i>StrLength(s)+1)        //参数不正确时返回空串
        return str;
    for (k=1;k<i;k++)                    //将s的前i个结点复制到str
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    while (p1!=NULL)                    //将t的所有结点复制到str
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p1->data;
        r->next=q;r=q;
        p1=p1->next;
    }
    while (p!=NULL)                        //将结点p及其后的结点复制到str
    {    q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}

串插入也是尾插法,为什么这里就不用让p的next指向NULL呢?