标题:求助!链表输出后第一位错误
只看楼主
应惜红颜
Rank: 2
等 级:论坛游民
帖 子:35
专家分:27
注 册:2018-5-20
结帖率:100%
已结贴  问题点数:20 回复次数:4 
求助!链表输出后第一位错误
2个集合排序
若用表La、Lb分别代表两个已存在的有序表,Lc为算法完成后产生新的有序表。可行的算法之一为:
从表La与Lb中各取一个元素进行比较,将小的元素插入到Lc中,并取小元素所在表的下一个元素继续与另一表的元素继续比较操作,直到一个表中元素取尽为止,再将另一表的余下元素直接挂入新表Lc的末尾。
//运行出来后面都对,就是第一位不知道怎么办。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
#define LEN sizeof(struct LNode)
//Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;
// ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;

struct LNode               /* 结点定义 */     
 {
   ElemType data;
   struct LNode *next;
 };
typedef struct LNode *LinkList; /* 表的头指针类型 */

struct LNode *input();
int ListLength(LinkList L);
Status GetElem(LinkList L,int i,ElemType *e);//
Status ListEmpty(LinkList L);//
struct LNode *ListInsert(LinkList L,int n,ElemType e);
struct LNode *MergeList(LinkList La,LinkList Lb,LinkList Lc);
int main()
{
    LinkList La=NULL,Lb=NULL;
    LinkList p;
    LinkList Lc=(struct LNode *)malloc(LEN);
    Lc->next=NULL;
    printf("请输入集合A(以0结尾):");
    La = input();
    printf("集合A的长度:%d\n",ListLength(La));
    printf("请输入集合B(以0结尾):");
    Lb = input();
    printf("集合B的长度:%d\n",ListLength(Lb));
    Lc=MergeList(La,Lb,Lc);
    printf("\n最后的长度:%d\n",ListLength(Lc));
    printf("结果为:");
    while (Lc != NULL)
    {
        printf("%d ", Lc->data);
        Lc = Lc->next;
    }
   
    return 0;
}
int ListLength(LinkList L)
{
    int i=1;
    LinkList p;
    p=L->next;
    while(p!=NULL)
    {
        p=p->next;
        i++;
    }
    return i;
}


struct LNode *input()
{
    struct LNode *head;
    struct LNode *p1,*p2;
    int i=0,j=0;
    p1=p2=(struct LNode *)malloc(LEN);
    scanf("%d",&p1->data);
    head=NULL;
    while(p1->data!=0)
    {
        i=i+1;
        if(i==1)
        {
            head=p1;
        }
        else
        {
            p2->next=p1;
        }
        p2=p1;
        p1=(struct LNode *)malloc(LEN);
        scanf("%d",&p1->data);
    }
    p2->next=NULL;
    return(head);   
}


struct LNode *ListInsert(LinkList L,int n,ElemType e)
{
    LinkList p1,p2,p;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data=e;
    p1=L;
    while(p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(p1->next==NULL)
    {
        p1->next=p;
        p->next=NULL;
    }
    return L;
}

 
Status GetElem(LinkList L,int i,ElemType *e)
{ /* L为单链表的头指针。当第i个元素存在时,
      其值赋给e并返回OK,否则返回ERROR */
   int j=1; /* j为计数器 */
   LinkList p=L; /* p指向第一个结点 */
   while(p&&j<i) /* 顺指针向后查找, 直到p指向第i个元素
                 或p为空 */
   {
     p=p->next;
     j++;
   }     
   if(!p||j>i)   /* 第i个元素不存在 */
     return ERROR;
   *e=p->data;   /* 取第i个元素 */
   return OK;
}

Status ListEmpty(LinkList L)
{ /* 初始条件:链式存储的表L已存在。*/
  /*操作结果:若L为空表,则返回TRUE,否则返回FALSE */
    if(L->next)
            return FALSE;
    else
            return TRUE;
}

struct LNode *MergeList(LinkList La,LinkList Lb,LinkList Lc)
 { /* 已知表La和Lb中的数据元素按值非递减排列。 */
   /* 归并La和Lb得到新的表Lc,Lc的数据元素也按值非递减排列 */
   int i=1,j=1;
   int k=0;
   int La_len=ListLength(La);
   int Lb_len=ListLength(Lb);
   int ai,bj;
   while(i<=La_len&&j<=Lb_len)          /* 表La和表Lb均非空 */
   {
     GetElem(La,i,&ai);
     GetElem(Lb,j,&bj);
     if(ai<=bj)
     {
       ListInsert(Lc,++k,ai);
       ++i;
     }
     else
     {
       ListInsert(Lc,++k,bj);
       ++j;
     }
   }
   while(i<=La_len)                /* 表La非空且表Lb空 */
   {
     GetElem(La,i++,&ai);
     ListInsert(Lc,++k,ai);
   }
   while(j<=Lb_len)                /* 表Lb非空且表La空 */
   {
     GetElem(Lb,j++,&bj);
     ListInsert(Lc,++k,bj);
   }
   return Lc;
 }
搜索更多相关主题的帖子: 元素 struct int next NULL 
2018-05-20 18:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:20 
LA,LB需要一个不存放数据的头结点,这样就可以不用管头结点的特殊性问题了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-20 18:11
应惜红颜
Rank: 2
等 级:论坛游民
帖 子:35
专家分:27
注 册:2018-5-20
得分:0 
回复 2楼 九转星河
需要定义一个输出的函数吗?
如果不需要,那么该怎样把head放在主函数中呢?

嶙峋
2018-05-20 20:27
应惜红颜
Rank: 2
等 级:论坛游民
帖 子:35
专家分:27
注 册:2018-5-20
得分:0 
回复 2楼 九转星河
需要定义一个输出的函数吗?
如果不需要,那么该怎样把head放在主函数中呢?

嶙峋
2018-05-20 20:27
应惜红颜
Rank: 2
等 级:论坛游民
帖 子:35
专家分:27
注 册:2018-5-20
得分:0 
回复 2楼 九转星河
谢谢哈,我改了。

嶙峋
2018-05-20 21:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-487102-1-1.html




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

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