首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

两单链表合并有关问题

2012-10-13 
两单链表合并问题头文件:[codeC/C++][/code]#ifndef LNODE_H_#define LNODE_H_typedef int ElemTypetype

两单链表合并问题
头文件:
[code=C/C++][/code]
#ifndef LNODE_H_
#define LNODE_H_

typedef int ElemType;

typedef struct LNode
{
ElemType elem;
struct LNode *next;
}node, *LinkNode;

int CreateList(LinkNode L);
int GetLeagth(LinkNode L);
int DisplayList(LinkNode L, int x);
int SortList(LinkNode L, int x);
int InsertList(LinkNode l);
LNode* FindNode(LinkNode l);
int CombinaList(LinkNode la, LinkNode lb, LinkNode lc);
#endif


CreateList.cpp:
[code=C/C++][/code]#include <stdio.h>
#include <malloc.h>
#include "LNode.h"

int CreateList(LinkNode L)
{
int i = 0;
LinkNode tail;
LinkNode head;
int x = 0;
int k = 0;
tail = L;
printf("how many number to you want to input?");
scanf("%d", &x);
for(i = 0;i < x;i++)
{
printf("please input the number:");
head = (LinkNode)malloc(sizeof(LNode));
scanf("%d",&k);
head->elem = k;
tail->next = head;
tail = head;
}
tail->next = NULL;
return 0;

}


GetLeagth.cpp
[code=C/C++][/code]
#include <stdio.h>
#include "LNode.h"

int GetLeagth(LinkNode L)
{
int i = 0;
LinkNode node;
node = L;
while(node->next != NULL)
{
i++;
node = (node)->next;
}
return i;
}

CombinaList.cpp
[code=C/C++][/code]
#include <stdio.h>
#include <malloc.h>
#include "LNode.h"

int CombinaList(LinkNode la, LinkNode lb, LinkNode lc)//合并la与lb,生成新链表lc
{
lc = la;
LinkNode node = la;
//node = lc;
while(node->next != NULL)
{
node = node->next;
}
node->next = lb;
//lc = la;
return 0;
}


DiaplayList.cpp
[code=C/C++][/code]
#include <stdio.h>
#include "LNode.h"

int DisplayList(LinkNode L, int x)
{
int i = 0;
LNode *node;
node = L;
printf("what your input is:");
for(i = 0;i < x;i++)
{
printf("%d", node->next->elem);//带头结点,需从下一个开始打印
node = node->next;
}
printf("\n");
return 0;
}


main.cpp
[code=C/C++][/code]
#include <stdio.h>
#include <malloc.h>
#include "LNode.h"

int main()
{
int i = 0;
int h = 0;
LinkNode la = (LinkNode)malloc(sizeof(node));//初始化一个头结点
la->next = NULL;
LinkNode lb = (LinkNode)malloc(sizeof(node));//初始化一个头结点
lb->next = NULL;
LinkNode lc = (LinkNode)malloc(sizeof(node));//初始化一个头结点
lc->next = NULL;
CreateList(la);
CreateList(lb);
i = GetLeagth(la);
h = GetLeagth(lb);

DisplayList(la,i);
DisplayList(lb,h);

CombinaList(la, lb, lc);
h = GetLeagth(lc);
printf("%d", h);
DisplayList(lc,h);
scanf("%d", &i);
return 0;

}


问题出现在CombinaList中,为何函数运行完成后,la的值就被改变,lc的值未变(返回值是初始化时的值)?合并失败

[解决办法]
给你改好了,主要有下面几个问题:
1,CombinaList中lc没有使用引用,函数返回时,实参不会改变
2,lb链表的头结点没有删除

潜在的问题:
1,链表函数都没有检查输入出错的情况,可能会在调用的时候一不小心就莫名其妙的死了。

其他一些在注释里面有详细说明。
另外最好不要使用这么多的文件,初学者一个就够了。

C/C++ code
#include <iostream>#include <string>#include <stdio.h>#include <malloc.h>using namespace std;typedef int ElemType;typedef struct LNode{    ElemType elem;    struct LNode *next;}node, *LinkNode;int CreateList(LinkNode L);int GetLeagth(LinkNode L);int DisplayList(LinkNode L, int x);int SortList(LinkNode L, int x);int InsertList(LinkNode l);LNode* FindNode(LinkNode l);void CombinaList(LinkNode la, LinkNode lb, LinkNode &lc);int CreateList(LinkNode L){    int i = 0;    LinkNode tail;    LinkNode head;    int x = 0;    int k = 0;    tail = L;        printf("how many number to you want to input?\n");  //有换行的话用起来会舒服一些    scanf("%d", &x);    for(i = 0;i < x;i++)    {        printf("please input the number:\n");        head = (LinkNode)malloc(sizeof(LNode));        scanf("%d",&k);        head->elem = k;        tail->next = head;            tail = head;    }    tail->next = NULL;    return 0;}int GetLeagth(LinkNode L){    int i = 0;    LinkNode node;    node = L;        if( node == NULL ) return 0;  //node 是一个指针,提前指针中的元素之前一定要检查指针是否为空指针    while(node->next != NULL)    {        i++;        node = (node)->next;    }    return i;}void CombinaList(LinkNode la, LinkNode lb, LinkNode &lc)//合并la与lb,生成新链表lc   lc必须使用引用,否则不会改变实参{    if( la == NULL ) {          //使用指针前,要考虑到指针为空的情况        lc = lb;        return;    }    if( lb == NULL ) {        lc = la;        return;    }    lc = la;    LinkNode node = la;    //node = lc;    while(node->next != NULL)    {        node = node->next;    }    //node->next = lb;          //注意lb是头结点,头结点不是元素结点,所以应该去掉头结点    node->next = lb->next;    free(lb);                    //释放空间    lb = NULL;    //return 0;                    //返回值没有意义}int DisplayList(LinkNode L, int x){    if( !L ){                      //编写链表的函数,第一点就是考虑为空的情况        cout << " The link table is NULL" <<endl;        return -1;    }    int i = 0;    LNode *node;    node = L;    printf("what your input is:");    for(i = 0;i < x;i++)    {        printf("%4d ", node->next->elem);     //带头结点,需从下一个开始打印, 结点之间有空格较好        node = node->next;    }    printf("\n");    return 0;}int main(){    int i = 0;    int h = 0;    LinkNode la = (LinkNode)malloc(sizeof(node));     //初始化一个头结点    la->next = NULL;    LinkNode lb = (LinkNode)malloc(sizeof(node));     //初始化一个头结点    lb->next = NULL;    LinkNode lc = (LinkNode)malloc(sizeof(node));     //初始化一个头结点    lc->next = NULL;    CreateList(la);    CreateList(lb);    i = GetLeagth(la);    h = GetLeagth(lb);    DisplayList(la,i);    DisplayList(lb,h);    CombinaList(la, lb, lc);    h = GetLeagth(lc);    printf("The length of c is: %d\n", h);  //最好有说明    DisplayList(lc,h);    scanf("%d", &i);    return 0;} 

热点排行