单链表求A-B和AUB出错


#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node *next;
}LNode,*LinkList;

LinkList Creat_LinkList()
{
    LinkList H;
    H=(LinkList)malloc(sizeof(LNode));
    if(H)
    H->next=NULL;
    return H;
}

void Destroy_(LinkList H)
{
    LinkList p,q;
    p=H;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }

    H=NULL;
}

int Length_LinkList(LinkList H)
{
    LinkList p=H;
    int count =-1;
    while(p)
    {
        p=p->next;
        count++;
    }

    return count;

}


LinkList Locate_LinkList(LinkList H,int i)
{
    LinkList p=H;
    int j;
    j=0;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }

    if(!p||i!=j)
    {
        printf("参数i错误或者单链表不存在:");
        return 0;
    }

    return p;

}

LinkList Locate_LinkList_valube(LinkList H,int x)
{
    LinkList p=H->next;
    while(p&&p->data!=x)
    {
        p=p->next;
    }

    return p;

}

int insert_LinkList(LinkList H,int i,int x)
{
    LinkList p,q;
    p=Locate_LinkList (H,i-1);
    if(!p)
    {
        printf("单链表不存在:");
        return 0;
    }

    q=(LinkList)malloc(sizeof(LNode));
    if(!q)
    {
        printf("开辟空间失败:");
        return 0;
    }

    p->data=x;
    q->next=p->next;
    p->next=q;

    return 1;
}

int Del_LinkList(LinkList H,int i)
{
    if(!H||H->next==NULL)
    {
        printf("单链表不存在:");
        return 0;
    }

    LinkList p,q;

    p=Locate_LinkList (H,i-1);

    if(!p||p->next==NULL)
    {
        printf("单链表不存在:");
        return 0;
    }

    q=p->next;
    p->next=q->next;
    free(q);
    return 1;

}



void reverse_LinkList(LinkList H)
{
    LinkList p,q;
    p=H->next;
    H->next=NULL;

    while(p)
    {
        q=p;
        p=p->next;
        q->next=H->next;
        H->next=q;

    }
}


void ajiaob(LinkList A,LinkList B)
{
    int x;
    LinkList p,pre;
    pre=A,p=pre->next;
    while(p)
    {
        x=p->data;
        if(Locate_LinkList_valube(B,x))
        {
            pre->next=p->next;
            free(p);
            p=pre->next;
        }

        else
        {
            pre=p;
            p=p->next;
        }
    }
}


void abingb(LinkList A,LinkList B)
{
    int x;
    LinkList p;
    p=B->next;

    while(p)
    {
        x=p->data;
        if(!Locate_LinkList_valube(A,x))
        {
            insert_LinkList(A,1,x);
        }

        else
        {
            p=p->next;
        }
    }

}
int main()
{
    int i,j;
    int a[8]={1,2,3,4,5,6,7,8},b[6]={1,3,5,10,16,19};
    LinkList A,B;
    A=Creat_LinkList();
    B=Creat_LinkList();

    for(i=0;i<8;i++)
    {
        insert_LinkList(A,i+1,a[i]);
    }

    for(j=0;j<6;j++)
    {
        insert_LinkList(B,j+1,b[j]);
    }

    LinkList A_B,AUB;
    A_B=Creat_LinkList();
    AUB=Creat_LinkList();
    int a_b,aub;

    a_b=Length_LinkList(A);
    aub=Length_LinkList(B);

    for(i=0;i<a_b;i++)
    {
        insert_LinkList(A_B,i+1,a[i]);
    }
    ajiaob(A_B,B);


    for(j=0;i<aub;j++)
    {
        insert_LinkList(A_B,j+1,b[j]);
    }
    abingb(AUB,B);

    printf("A_B:");

    for(i=0;i<a_b;i++)
    {
        LinkList p=A_B->next;
        for(j=0;j<=i;j++)
        {
            p=p->next;
        }

        printf("%d ",p->data);
    }

    for(i=0;i<aub;i++)
    {
        LinkList pre=AUB->next,p;
        p=pre->next;
        for(j=0;j<=i;j++)
        {
            pre=p;
            p=p->next;
        }

        printf("%d ",p->data);

    }//输出链表中元素的功能

    return 0;

}

这是一个用单链表实现集合A-B,AUB功能的代码,不知为何会运行后直接无任何输出就结束了

修改如下,改动处见注释 “修改” ,供参考:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct node
{
    int data;
    struct node *next;
}LNode,*LinkList;
 
LinkList Creat_LinkList()
{
    LinkList H;
    H=(LinkList)malloc(sizeof(LNode));
    if(H)
        H->next=NULL;
    return H;
}
 
void Destroy_(LinkList H)
{
    LinkList p,q;
    p=H;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
 
    H=NULL;
}
 
int Length_LinkList(LinkList H)
{
    LinkList p = H;
    int count = -1;
    while(p)
    {
        p=p->next;
        count++;
    }
    return count;
}

LinkList Locate_LinkList(LinkList H,int i)
{
    LinkList p=H;
    int j;
    j=0;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
 
    if(!p||i!=j)
    {
        printf("参数i错误或者单链表不存在:");
        return 0;
    }
    return p;
}
 
LinkList Locate_LinkList_valube(LinkList H,int x)
{
    LinkList p=H->next;
    while(p&&p->data!=x)
    {
        p=p->next;
    }
 
    return p;
 
}
 
int insert_LinkList(LinkList H,int i,int x)
{
    LinkList p,q;
    p=Locate_LinkList (H,i-1);
    if(!p)
    {
        printf("单链表不存在:");
        return 0;
    }
 
    q=(LinkList)malloc(sizeof(LNode));
    if(!q)
    {
        printf("开辟空间失败:");
        return 0;
    }
 
    q->data=x;   // p->data=x; 修改
    q->next=p->next;
    p->next=q;
 
    return 1;
}
 
int Del_LinkList(LinkList H,int i)
{
    if(!H||H->next==NULL)
    {
        printf("单链表不存在:");
        return 0;
    }
 
    LinkList p,q;
 
    p=Locate_LinkList (H,i-1);
 
    if(!p||p->next==NULL)
    {
        printf("单链表不存在:");
        return 0;
    }
 
    q=p->next;
    p->next=q->next;
    free(q);
    return 1;
}

void reverse_LinkList(LinkList H)
{
    LinkList p,q;
    p=H->next;
    H->next=NULL;
 
    while(p)
    {
        q=p;
        p=p->next;
        q->next=H->next;
        H->next=q;
    }
}

void ajiaob(LinkList A,LinkList B)
{
    int x;
    LinkList p,pre;
    pre=A,p=pre->next;
    while(p)
    {
        x=p->data;
        if(Locate_LinkList_valube(B,x))
        {
            pre->next=p->next;
            free(p);
            p=pre->next;
        }
        else
        {
            pre=p;
            p=p->next;
        }
    }
}

void abingb(LinkList A,LinkList B)
{
    int x;
    LinkList p;
    p=B->next;
 
    while(p)
    {
        x=p->data;
        if(!Locate_LinkList_valube(A,x))
        {
            insert_LinkList(A,1,x);
        }
        //else 修改
        //{    修改
        p=p->next;
        //}    修改
    }
}
int main()
{
    int i,j;
    int a[8]={1,2,3,4,5,6,7,8},b[6]={1,3,5,10,16,19};
    LinkList A,B;
    A=Creat_LinkList();
    B=Creat_LinkList();
 
    for(i=0;i<8;i++)
    {
        insert_LinkList(A,i+1,a[i]);
    }
 
    for(j=0;j<6;j++)
    {
        insert_LinkList(B,j+1,b[j]);
    }
 
    LinkList A_B,AUB;
    A_B=Creat_LinkList();
    AUB=Creat_LinkList();
    int a_b,aub;
 
    a_b=Length_LinkList(A);
    aub=Length_LinkList(B);
 
    for(i=0;i<a_b;i++)
    {
        insert_LinkList(A_B,i+1,a[i]);
    }
    ajiaob(A_B,B);
 

    for(j=0;j<aub;j++) // 修改
    //for(j=0;i<aub;j++)
    {
        insert_LinkList(AUB,j+1,b[j]); // 修改
        //insert_LinkList(A_B,j+1,b[j]);
    }
    abingb(AUB,A);  //abingb(AUB,B); // 修改

    printf("A_B:");
    a_b=Length_LinkList(A_B);// 修改
    for(i=0;i<a_b;i++)
    {
        LinkList p=A_B; //->next;修改
        for(j=0;j<=i;j++)
        {
            p=p->next;
        }

        printf("%d ",p->data);
    }
    printf("\n");

    printf("AUB:");
    aub=Length_LinkList(AUB); // 修改
    for(i=0;i<aub;i++)
    {
        LinkList p=AUB; //pre=AUB->next, 修改
                        //p=pre->next;   修改
        for(j=0;j<=i;j++)
        {
                        //pre=p;         修改
            p=p->next;
        }
 
        printf("%d ",p->data);
 
    }//输出链表中元素的功能

    return 0;
 
}

代码存在死循环,所以没有输出
很明显,你没有将最后一个节点的指针设置为NULL,导致Locate_LinkList_valube死循环呢

img