标题:合并两个链表,可是运行不通过耶~请各位高手帮忙看看错在哪里?
只看楼主
风铃之美
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-4-2
 问题点数:0 回复次数:10 
合并两个链表,可是运行不通过耶~请各位高手帮忙看看错在哪里?
#include "stdio.h"
#include "malloc.h"
 struct node
{
    int data;
    struct node *next;
};

struct node * creat(void)
{
  struct node *p1,*p2,*head;
  p2=p1=(struct node *)malloc(sizeof(struct node));
  scanf("%d",&p1->data);
  head=p1;
  while(p1->data!=NULL)
  {
    p1=(struct node *)malloc(sizeof(struct node));
    scanf("%d",&p1->data);
    p2->next=p1;
    p2=p1;
   }
    p2->next=NULL;
   return(head);
  }
struct node * print(struct node *head)
{
  struct node  *p; int sum=0;
  printf("the data of the list are:\n");
  p=head;
  while(p->next!=NULL)
  {
    printf("%d ",p->data);
    p=p->next;sum++;
  }
}
struct node * connect(struct node *hx,struct node *hy)
{
  struct node *p,*hz;
  p=hx;
  while(p->next!=NULL)
  p=p->next;
  p->next=hy;
  hz=hx;
  return(hz);
  }
main()
{
  struct node *hx,*hy,*hz;
  printf("please enter the data of X");
  hx=creat();
  print(hx);
  printf("please enter the data of Y");
  hy=creat();
  print(hy);
  hz=connect(hx,hy);
  print(hz);
}
搜索更多相关主题的帖子: node 链表 struct head 
2008-04-06 12:46
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
你上次发的那个链表的帖子问题解决了吗?

—>〉Sun〈<—
2008-04-06 12:52
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 

// 送你段代码 //

//----------------------------------------------------
// 在链表中顺序插入节点
// DEV-C++ 编译通过,并测试无错,如果有错发消息给我
//----------------------------------------------------

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

typedef struct Node {
    int iData;
    struct Node * pNext;
} * List, Node;

List InitializeList(void);                   // 初始化列表
int InsertNode(List * pList, int iNewData);  // 从小到大插入插入数据
int ShowList(List * pList);                  // 显示列表
void DelList(List * pList);                  // 删除列表

//----------------------------------------------------

int main(void)
{
    List lobj;
    int data;
   
    lobj = InitializeList();
   
    // ShowList(&lobj);
   
    printf("    请输入一组int数据,每个数据之间用空格分开,\n"
           "并一个非数字字符结束输入。\n");
    while(scanf("%d", &data) == 1)
        InsertNode(&lobj, data);

    ShowList(&lobj);
   
    DelList(&lobj);
   
    system("Pause");
    return 0;
}

//----------------------------------------------------

List InitializeList(void)           // 初始化列表
{
    return NULL;
}

int InsertNode(List * pList, int iNewData)    // 从小到大插入插入数据
{
    Node * pCurNode;    // 指向当前节点
    Node * pPreNode;    // 指向前一个节点
    Node * pNewNode;    // 指向新创建的节点
   
    pPreNode = NULL;
    pCurNode = *pList;
   
    pNewNode = (Node *)malloc(sizeof(Node));   // 创建一个新节点
   
    if(pNewNode == NULL)      // 新节点创建失败
        return 0;

    pNewNode->iData = iNewData;      // 把数据放入该节点
   
    while(pCurNode != NULL && pCurNode->iData <= iNewData)
    {
        pPreNode = pCurNode;
        pCurNode = pCurNode->pNext;
    }
   
    pNewNode->pNext = pCurNode;  // 把比 iNewData (数据)大的节点放在新节点后
   
    if(pPreNode == NULL)    // 列表为空,或在第一个数据前
    {
        *pList = pNewNode;
    }
    else                    // 列表中,或列结尾
    {
        pPreNode->pNext = pNewNode;
    }

    return 1;
}

int ShowList(List * pList)                 // 显示列表
{
    int count = 0;      // 节点个数
    Node * pCurNode;    // 指向当前节点
   
    pCurNode = *pList;  // 指向第一个节点

    while(pCurNode != NULL)
    {
        ++count;
        printf("%d ", pCurNode->iData);
        pCurNode = pCurNode->pNext;
    }
   
    if(count == 0)
        printf("\n列表中无数据!\n");

    putchar('\n');
    return count;
}

void DelList(List * pList)          // 删除列表(删除所有节点)
{
    Node * pCurNode;    // 指向当前节点
    Node * pTempNode;   // 临时节点指针
   
    pCurNode = *pList;  // 指向第一个节点
   
    while(pCurNode != NULL)
    {
        pTempNode = pCurNode->pNext;
        free(pCurNode);
        pCurNode = pTempNode;
    }
   
    *pList = NULL;
}

—>〉Sun〈<—
2008-04-06 12:53
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
while(p1->data != NULL) 为何有这个?

—>〉Sun〈<—
2008-04-06 12:58
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
/* 只写了一个合并函数 */
struct node * connect(struct node * a, struct node * b)
{
    struct node * p = a;
    if(a == NULL)      // 链表a为空
    {
        a = b;
    }
    else if(b != NULL)    // 链表b不为空
    {
        while(p->next != NULL)
            p = p->next;
        p->next = b;
    }
   
    return a;
}
    如果链表a 为空,则返回链表b 。

    如果链表b 为空,就不需要把链表b添加到链表a 的尾部,
所以只有在链表b 不为空的情况下才需要把链表b 添加到链表a 的尾部。



[[it] 本帖最后由 cosdos 于 2008-4-6 13:57 编辑 [/it]]

—>〉Sun〈<—
2008-04-06 13:21
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
创建链表最好使用一个“添加新节点的函数”,每输入一个数字,就插入一个新节点。直到链表满或者输入了表示输入终止的终止符。输入第一个数字时链表为空(NULL),通过添加新节点的函数把新节点添加到链表中。

    这样程序就能够更加灵活。

    可以用一种抽象的数据表示方法 ADT,其实就是操作链表的函数。就像使用printf() 函数那样,你并不需要知道它如果实现的,只要知道它如何使用。printf()操作的是stdout (标准输出, 类型是 FILE *)。

—>〉Sun〈<—
2008-04-06 13:36
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
while(p1->data != NULL) // 用这个结束输入并合适

while(p1->data != 0)  //  用这个吧

[[it] 本帖最后由 cosdos 于 2008-4-6 13:51 编辑 [/it]]

—>〉Sun〈<—
2008-04-06 13:47
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
// 5楼代码居然写错了,失误

struct node * connect(struct node * a, struct node * b)
{
    struct node * p = a;
    if(a == NULL)      // 链表a为空
    {
        a = b;
    }
    else if(b != NULL)    // 链表b不为空
    {
        while(p->next != NULL)
            p = p->next;
        p->next = b;
    }
   
    return a;
}

—>〉Sun〈<—
2008-04-06 13:57
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
// creat() 函数修正 //

struct node * creat(void)
{
    struct node *pcur, *pnew, *head;
   
    head = pnew = (struct node *)malloc(sizeof(struct node));
   
    scanf("%d", &pnew->data);
    if(pnew->data == 0)
    {
        free(pnew);
        head = NULL;
    }
    else
    {
        while(pnew->data != 0)
        {
            pcur = pnew;
            pnew = (struct node *)malloc(sizeof(struct node));
            scanf("%d", &pnew->data);
            pcur->next = pnew;
        }
   
        if(pnew->data == 0)
        {
            free(pnew);
            pcur->next = NULL;
        }
    }

    pcur->next = NULL;
    return head;
}

// 5楼代码居然写错了,失误  // connect()函数修正
struct node * connect(struct node * a, struct node * b)
{
    struct node * p = a;
    if(a == NULL)      // 链表a为空
    {
        a = b;
    }
    else if(b != NULL)    // 链表b不为空
    {
        while(p->next != NULL)
            p = p->next;
        p->next = b;
    }
   
    return a;
}

// print() 函数修正
int print(struct node * p)
{
    int sum = 0;
   
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
        sum++;
    }
    putchar('\n');
    return sum;
}


—>〉Sun〈<—
2008-04-06 14:24
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
得分:0 
整个程序就是个错误。

函数都有问题。

改写的函数中还可以加入对malloc()函数分配内存是否成功作判断。

—>〉Sun〈<—
2008-04-06 14:33



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




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

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