回 帖 发 新 帖 刷新版面

主题:关于归并2个链表?

#include "stdio.h"
#include "malloc.h"
typedef struct LA
{
    int n;
    struct LA *next;
}Lnode;
typedef Lnode *Llist;
#define LEN sizeof(struct LA)
Lnode *jianli(void)
{
    Lnode *head=(Lnode *)malloc(LEN);
    Llist p,r;
    r=head;
    while(p->n!=0)
    {
        p=(Lnode *)malloc(LEN);
        printf("输入数字: ");
        scanf("%d",&p->n);
        r->next=p;
        r=p;
    }
    r->next=NULL;
    return head;
}
void print(Lnode *head)
{
    Llist p;
    p=head;
    if(p->next=NULL)
        printf("错误");
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d\n",p->n);
    }
}
void guibing(Lnode *head1,Lnode *head2,Lnode *head3)
{
    Llist p1,p2,p3;
    p1=head1;p2=head2;
    head3=p3=p1;
    while(p1&&p2)
    {
        if(p1->n<=p2->n)
        {
            p3->next=p1;p3=p1;p1=p1->next;
        }
        else
        {
            p3->next=p2;p3=p2;p2=p2->next;
        }
        p3->next=(p1!=NULL)?p1:p2;
        free(head2);
        
    }
}
void main()
{
    Lnode *head1,*head2,*head3;
    head3=NULL;
    head1=jianli();
    head2=jianli();
    guibing(head1,head2,head3);
    print(head1);
    print(head2);
    print(head3);
}
刚学2天数据结构...实在找不出错误...VC++也没显示有错误....
但是运行的话就弹出错误窗口.....请大家帮我看下..是哪出错了..
或者给我个完整的合并2个链表原代码..先谢谢大家了.

回复列表 (共3个回复)

沙发


#include "stdio.h"
#include "malloc.h"
#define NULL 0
struct LinkList
{
  int data;
  struct LinkList * next;
};
struct LinkList *create(void);
struct LinkList *guibin(struct LinkList *L1,struct LinkList *L2);
void output(struct LinkList *L);

void main()
{
struct LinkList *L,*L1,*L2;
L1=create();
L2=create();
printf("The list L1:\n");
output(L1);
printf("The list L2:\n");
output(L2);
L=guibin(L1,L2);
printf("The union of the two lists are:\n");
output(L);
}

struct LinkList *create(void)
{
    struct LinkList *h,*p,*q;
    int n;
    h=(struct LinkList *)malloc(sizeof(struct LinkList));//(生成一头接点)
    h->data=NULL;
    q=h;
    printf("Please input a number:\n");
    scanf("%d",&n);
    while(n!=-1)
    { p=(struct LinkList *)malloc(sizeof(struct LinkList));
      p->data=n;
      q->next=p;
      q=p;
      q->next=NULL;
     // printf("Please input a number:\n");
      scanf("%d",&n);
    }
    return h;
}

struct LinkList *guibin(struct LinkList *L1,struct LinkList *L2)
{
    struct LinkList *p,*q;


       p=L1;
    while(p->next) 
    { 
        p=p->next;
    }
    p->next=L2->next;
    return L1;

    
}

void output(struct LinkList *L)
{
    struct LinkList *p;
    p=L->next;
    while(p)
    { printf("%d  ",p->data);
      p=p->next;
    }
    printf("\n");
}

[em9][em9][em9]

板凳

我来备注一下吧!呵呵
//头文件声明
#include "stdio.h"
#include "malloc.h"
//定义常量 NULL
#define NULL 0
//定义链表数据元素的结构体
struct LinkList
{
  int data;
  struct LinkList * next;
};
//声明创建链的函数返回值表头指针,参数为空
struct LinkList *create(void);
//声明合并函数返回值新表头头指针,参数为两个要合并链表的头指针
struct LinkList *guibin(struct LinkList *L1,struct LinkList *L2);
//声明输出链表函数,参数为表头指针
void output(struct LinkList *L);
//主函数开始
void main()
{
struct LinkList *L,*L1,*L2;//定义三个结构指针,这里也就是链表指针
L1=create();//创建链表L1
L2=create();//创建链表L2
printf("The list L1:\n");//输出链表L1
output(L1);//调用输出函数,把链表L1首地址传过去
printf("The list L2:\n");//输出链表L2
output(L2);//调用输出函数,把链表L2首地址传过去
L=guibin(L1,L2);/*调用合并函数,参数的链表L1首地址,和链表L2首地址,返回新表并用L指向新链表的首地址*/
printf("The union of the two lists are:\n");//输出合并后的新链表
output(L);//调用输出函数,参数为合并的链表的首地址
}
//结束主函数
//创建链表函数的实现返回值为表头指针
struct LinkList *create(void)
{
    struct LinkList *h,*p,*q;//定义三个结点指针
    int n;//定义整型变量n

    h=(struct LinkList *)malloc(sizeof(struct LinkList));//(生成一头接点)
    h->data=NULL;//头结点的数据项为空
    q=h;//q指向头结点,理解一下,就是保存好头指针
    printf("Please input a number:\n");//输入一个整
    scanf("%d",&n);
    while(n!=-1)//如果变量n值不是-1执行循环体
    { p=(struct LinkList *)malloc(sizeof(struct LinkList));/*创建一个新结点并让p指向这个新结点*/
      p->data=n;//给新结点的添加数据n,也就是p指向的结点
      q->next=p;//让q的指针向存放p结点
      q=p;//让q重新指向新建的结点
      q->next=NULL;/*令q结点的指针向指向空,这里一定要理解,意思就是令刚才新建的那个结点的指针向指向空,因为上面一向己经把指针q移动到新建的结点上了*
     // printf("Please input a number:\n");
      scanf("%d",&n);/*继续输入结的值如里是-1就不会执新循环了,也就是不再为链表添加新的结点了*/
    }
    return h;//返回表头指针
}
//下面是合并函数的实现
struct LinkList *guibin(struct LinkList *L1,struct LinkList *L2)
{
    struct LinkList *p,*q;//定义两个结点指针*q是多余的


       p=L1;//p指向了表L1的头结点
    while(p->next) 
    { 
        p=p->next;
    }//循环的作用是使p指向表L1的最后那个结点
    p->next=L2->next;/*使表L1最后那个结点的指针指向L2表的第一个结点,在这一定要主意不是L2表的头结点*/
    return L1;//返回合并后的表头

    
}
//下面是输出函数的实现,这个函数在也就不用我解释了吧呵呵
void output(struct LinkList *L)
{
    struct LinkList *p;
    p=L->next;
    while(p)
    { printf("%d  ",p->data);
      p=p->next;
    }
    printf("\n");
}

3 楼

先谢谢楼上的二位..
我拿去研究研究~~[em7]

我来回复

您尚未登录,请登录后再回复。点此登录或注册