回 帖 发 新 帖 刷新版面

主题:我这个删除链表A和B与C中的相同元素.为什么最后一个总有点问题呢?其他的都可以^^

[color=FF0000]我这个删除链表A和B与C中的相同元素.为什么最后一个总有点问题呢?其他的都可以^^[/color]
我的几个研究生老师,找了半天也没有找出点什么来,我也不知道为什么>明明算法是对的,貌似也没有错误**
这是头文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define NULL 0
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define LEN sizeof(LNode)


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

//1.构造新的单链表L
LinkList CreateList(LinkList L,int n)
{
    int i;
    LinkList p,q,head;
    L=(LinkList) malloc(LEN);
    head=L;
    q=L;
    for(i=1;i<=n;i++)
    {
        p=(LinkList) malloc(LEN);    
        q->next=p;
        q=p;        
        printf("\n请输入单链表的第%d数据:\n",i);
        scanf("%d",&p->data);
        printf("\n你刚才输入的数据为%d\n",p->data );        
    }
    p->next = NULL;
    return L;
}

//5.求单链表的长度
int ListLength(LinkList L)
{
    int count=0;
    LinkList p=L;
    while(p->next)
    {
        count++;
        p=p->next;
    }
    return count;
}


//2.打印单链表A
LinkList PrintList(LinkList L)
{    
    int i;
    LinkList pt;
    pt=L->next;
    for(i=1;i<=ListLength(L);i++)
    {
        printf("%d ",pt->data);
        pt=pt->next;
    }
    return L;
}

//3.在单链表中的第i位上插入一个项
LinkList InsertList(LinkList L, int i,int e)
{
    LinkList p,s_insert;
    s_insert=(LinkList)malloc(LEN);
    int j=0;
    p=L;    
    s_insert->data=e;
    while(p && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
    {
        return ERROR;
    }        
    s_insert->next=p->next;
    p->next=s_insert;    
    return L;
}

//4.在单链表的第i位上删除一个项,并释放它所占用的空间
LinkList DeleteList(LinkList L, int i)
{
    int j=0;
    int e;
    LinkList p,cur_pt;
    p=L;

    while(p  && j<i-1)     //找到要删除元素的“前驱”
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
    {
        return ERROR;
    }    
    cur_pt=p->next;       //找到要删除的元素
    e=cur_pt->data;
    printf("你刚删除的数值是:%d\n",e);
    cur_pt->next=p->next;
    free(cur_pt);           
    return L;
}

下面的就是使用的算法了,
#include <stdio.h>
#include "交集.h"

void main()
{
    LinkList A= NULL;
    LinkList B= NULL;
    LinkList C= NULL;
    int an,bn,cn;
    
    LinkList pa;
    LinkList pb;
    LinkList pc;
    LinkList cur_pt;
    printf("请问A是几元链表:\n");
    scanf("%d",&an);
    printf("请问B是几元链表:\n");
    scanf("%d",&bn);
    printf("请问C是几元链表:\n");
    scanf("%d",&cn);
    printf("请输入A链表的元素:\n");
    A=CreateList(A,an);
    printf("\n请输入B链表的元素:\n");
    B=CreateList(B,bn);
    printf("/n请输入C链表的元素:\n");
    C=CreateList(C,cn);    
    printf("\n**********************链表的输出*******************************\n");
                                printf("链表A为:\n");
                                PrintList(A);    
                                printf("\n链表B为:\n");
                                PrintList(B);    
                                printf("\n链表C为:\n");
                                PrintList(C);    
    printf("\n**********************链表的输出*******************************\n");

    for(pa=A;pa->next!=NULL;)
    {

        for(pb=B->next;pb!=NULL;pb=pb->next)
        {
            for(pc=C->next;pc!=NULL;pc=pc->next)
            {
                if(pa->next->data==pb->data && pa->next->data==pc->data)
                {
                    cur_pt=pa->next;
                    pa->next=pa->next->next;
                    free(cur_pt);
                    if(pa->next!=NULL)//由于pa->next=pa->next->next;
                    pa=pa->next;
                }
            }            
        }        
    }

    printf("完成操作后的链表为:\n");
    for(pa=A->next;pa!=NULL;pa=pa->next)
    {
        printf("%d ",pa->data);
    }
    printf("\n");
}

回复列表 (共4个回复)

沙发

有#include "交集.h"这个的头文件,呵呵,还没见过,程序再看看.问题能不能再说详细一点.

板凳

//4.在单链表的第i位上删除一个项,并释放它所占用的空间
LinkList DeleteList(LinkList L, int i)
{
    int j=0;
    int e;
    LinkList p,cur_pt;
    p=L;

    while(p  && j<i-1)     //找到要删除元素的“前驱”
    {
        p=p->next;
        j++;
    }
    if(!p || j>i-1)
    {
        return ERROR;
    }    
    cur_pt=p->next;       //找到要删除的元素
    e=cur_pt->data;
    printf("你刚删除的数值是:%d\n",e);
    cur_pt->next=p->next;// 我认为应该是这样: p->next=cur_pt->next;
    free(cur_pt);           
    return L;
}

3 楼

这题的错误很郁闷,就是说比如你输入A为 1 2 3 4  B为1 3 8 C为2 3 7 9 的,它能正确的执行下去,但是要是是(A)1 2 3 4    (B)2 3 4   (C)1 2 3 4 时,就提示有错误,我的几个研究生老是该了一下午,也不知道该怎么样弄对,所以我只好请教广大人民了

1楼的同学你好:    "交集.h"是我自己做的头文件 ,你可以把它放在头文件库里,然后用#include <交集.h>,调用,也可以用#include"交集.h"调用,


2楼的同学你好 :   你说的有道理,但是和这题目的关键没有多大的联系,所以希望你能多用的时间来好好读下这个程序的意思,谢谢! 它是要删除A中的元素,这些元素是在B,C中都有出现的.我决得我的程序一点问题也没有,但是还是有bug!!郁闷的bug.

4 楼

for(pa=A;pa->next!=NULL;)
在判断语句里;如果相同的元素不是A中的第一个,那pa就走不了

改为for(pa=A;pa->next!=NULL;pa=pa->next)
把if(pa->next!=NULL)//由于pa->next=pa->next->next;
     pa=pa->next;
删掉


比如你输入A为 1 2 3 4  B为1 3 8 C为2 3 7 9 的,它能正确的执行下去
--------------------------------------------
是楼主打错了C中的元素吧,我的机子就不能执行

我来回复

您尚未登录,请登录后再回复。点此登录或注册