| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 188 人关注过本帖
标题:两个顺序表求交集,运行时没结果,算法有问题?
收藏  订阅  推荐  打印
zwqbq
Rank: 1
等级:新手上路
帖子:21
积分:336
注册:2008-9-13
两个顺序表求交集,运行时没结果,算法有问题?

[qq]

  • 876563255
[/qq]//题目2.27:求元素递增排列的线性表A和B(同一表中可能存在相同的元素)的元素的交集并存入C中,
//C要求元素各不同且要用A表空间存放C,元素递增有序

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OVERFLOW 0
#define OK 1

typedef struct
{
    int * elem;
    int length;
    int listsize; //当前分配的存储容量(以sizeof(int)为单位
}SqList;

int InitList_Sq(SqList &L) //构造一个空的线性表
{
    L.elem = (int *) malloc (LIST_INIT_SIZE * sizeof (int));
    if (! L.elem)
        exit(OVERFLOW);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
} //InitList_Sq


int SqList_Intersect_True(SqList &A, SqList B) //求元素递增排列的线性表A和B的元素的交集并存回A中
{
  int i = 0;
  int j = 0;
  int k = 0;

  int alength = 0;

  while (A.elem[i]&&B.elem[j])
  {
    if (A.elem[i]<B.elem[j])
    {
        i++;
    }
    else if (A.elem[i]>B.elem[j])
    {
        j++;
    }
    else if (A.elem[i] != A.elem[k]) //
    {
      A.elem[k] = A.elem[i]; //当发现了一个在A,B中都存在的元素
      i++; //且C中没有,就添加到C中
      j++;
      k++;
      alength++;
    }
  } //while
  while (A.elem[k])
  {
      A.elem[k++]=0;
  }
  return alength;
} //SqList_Intersect_True

int main()
{
    int m;
    int n;
    int i;
    SqList A;
    SqList B;
    int k = 0;
    int alength;

    InitList_Sq(A); //构造顺序线性表A

    printf("构造顺序线性表A:\n");
    printf("输入元素的个数m:");
    scanf("%d",&m);
    printf("输入递增有序的(允许有相同的)%d个整型数据元素:\n",m);
    for (i = 0; i<m; i++)
    {
        scanf("%d",&A.elem[i]);
    }

    InitList_Sq(B); //构造顺序线性表B

    printf("构造顺序线性表B:\n");
    printf("输入元素的个数n:");
    scanf("%d",&n);
    printf("输入递增有序的(允许有相同的)%d个整型数据元素:\n",n);
    for (i = 0; i<n; i++)
    {
        scanf("%d",&B.elem[i]);
    }

    alength = SqList_Intersect_True(A, B); //求元素的交集,这种调用,有参数返回!

    printf("求交后的顺序表C:\n");
    for (k = 0; k<alength; k++) //输出
    {
        printf("%d ",A.elem[k]);
    }

    printf("\n");
    free(A.elem);
    free(B.elem);
    return 0;
}

[ 本帖最后由 zwqbq 于 2008-10-5 13:09 编辑 ]
2008-10-5 12:31
nuciewth
Rank: 12Rank: 12Rank: 12
等级:版主
帖子:9498
积分:94816
威望:93
来自:我爱龙龙
注册:2006-5-23

无非是就是地址越界,使用空指针等类似的。

倚天照海花无数,流水高山心自知。
2008-10-5 13:00
zwqbq
Rank: 1
等级:新手上路
帖子:21
积分:336
注册:2008-9-13
回复 2# nuciewth 的帖子

应该不是吧,如果是的话,应该怎样改?
2008-10-5 13:05
崔园园
Rank: 2
等级:注册会员
帖子:54
积分:610
注册:2008-4-21

你这个程序没有给A与B初始化,当给A输了几个数后,A没办法引用它
2008-10-5 16:22
共有 187 人关注过本帖
发新话题
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.050269 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved