| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 558 人关注过本帖
标题:请教莱鸟我近一个星期也不能解决的程序~~~~
只看楼主 加入收藏
hcanhong
Rank: 1
来 自:肇庆学院网络工程系
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-9-6
收藏
 问题点数:0 回复次数:3 
请教莱鸟我近一个星期也不能解决的程序~~~~
原程序如下:

/**************a,b,c为三个递增有序的线性表,现对a操作:要求删除既在b出现又在c出现的元素************/

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

#define LIST_INIT_SIZE 100
#define NULL 0

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

LinkList creat(LinkList head)
{
    LinkList l, q, p;//用指针类型定义三个节点类型的指针
    int ch;

    l = (LinkList)malloc(sizeof(LNode));//分配内存空间           
    l->data = 0;  //为头结点的数据域赋值,值为0                        
    l->next = NULL; //指明下一个结点目前不存在                 

    q = l;   //q为游动指针,链表结点的连结要用

    printf("Input the Incremental s:\n");
    scanf("%d",&ch);   

    while (ch != 0)      //输入0,表示输入结束                        
    {
        p = (LinkList)malloc(sizeof(LNode));  //为新输入的数据分配内存空间           
        p->data = ch;
        p->next = NULL;                    //新输入的节点在链表的最后,即它的后面没有其他元素
        q->next = p;                    //q用于将上一个元素链接至当前新元素
        q = p;                       //q自己移到当前最后一个元素,以备继续链接所用
        scanf("%d",&ch);
    }

    q = l;//输入整个链表前,先将q移到链表头,l一般不动

    return q;
}   

void LinkList_Intersect_Delete(LinkList a,LinkList b,LinkList c)
{
    LinkList p, q, r;
    LinkList s, t;
    int u;

    r = a->next;
    p = b->next;
    q = c->next;
    
    while ( p && q && r )
    {
        if (p->data < q->data)
            p = p->next;
        else if (p->data > q->data)
            q = q->next;
        else if (p->data == q->data)
        {
            u = p->data; //确定待删除元素u
            while (r->next->data < u)
                r = r->next; //确定最后一个小于u的元素指针r
            if (r->next->data == u)
            {
                s = r->next;
                if (s->data == u)
                {
                    t = (LinkList)malloc(sizeof(LinkList));
                    t = s;
                    t->next = NULL;
                    s = s->next;
                //    r->next = s->next;
                    free(t); //确定第一个大于u的元素指针s
                }
                    r->next = s;//删除r和s之间的元素
            }
            while (p->data == u)
                p = p->next;
            while (q->data == u)
                q = q->next;
        }
    }

    r = a->next;//输入整个链表钱,先将r移到链表头,a一般不动
    /*打印结果*/
    while (r->next != NULL)
    {
        printf(" %d",r->next->data);
        r = r->next;
    }

}

void main()
{
    LinkList a = NULL, b = NULL, c = NULL;

    a = creat(a);
    b = creat(b);
    c = creat(c);

    LinkList_Intersect_Delete(a, b, c);
}
程序总是在LinkList_Intersect_Delete中中断,不能如期打印出结果!!~~
现向各位请教,程序如何调试才能如期打印结果~~~~谢咯~
搜索更多相关主题的帖子: include 线性表 空间 元素 
2008-10-05 16:24
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1696
专家分:4295
注 册:2007-12-27
收藏
得分:0 
1、   while ( p && q && r )表示三个链表任意一个到末尾了就结束操作,也就是说假如别处都正常,那也只能在运气好的情况下删掉一个节点,难道题目规定了不可能有多个需要删除的节点么?
2、
                    t = (LinkList)malloc(sizeof(LinkList));
                    t = s;
这就丢掉了刚分配的内存,t指向别处去了。
3、
                    t = s;
                    t->next = NULL;
                    s = s->next;
显然,这个地方就是人为地截断了链表,后面所有的节点都丢了,再也找不到了,所以我也不继续看了。
2008-10-05 16:50
守鹤
Rank: 4
来 自:山東臨沂
等 级:贵宾
威 望:12
帖 子:337
专家分:0
注 册:2008-6-20
收藏
得分:0 
[bo][un]KillC[/un] 在 2008-10-5 23:29 的发言:[/bo]

楼主你对指针有多了解??

正是不了解,才有问题,有了问题,才有可能更深入了解

多少个日日夜夜想起你,只希望有缘再次相见
2008-10-05 23:39
快速回复:请教莱鸟我近一个星期也不能解决的程序~~~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013369 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved