标题:程序总是崩溃 合并单链表
只看楼主
ZQVVVVV
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-1-8
结帖率:66.67%
已结贴  问题点数:8 回复次数:2 
程序总是崩溃 合并单链表
#define ElemType int/*线性表内数据类型定义为整形 */
#define ERROR
#define OK
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{ElemType data;
struct Node* next;
 
}Node,* LinkList; /*链表的结构体建立&命名*/

InitList(LinkList* L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next==NULL;
}

void PriList(LinkList L)/*输出线性表内容的函数*/
{
LinkList p;
printf("\n链表内容为\n");
p=L->next;
 while(p->next!=NULL)
    {
        p=p->next;
        printf("%d\n",p->data);
    }   
}
 
void PriList1(LinkList L)/*输出线性表内容的函数*/
{
LinkList p;
printf("\n链表内容为\n");
p=L;
 while(p->next!=NULL)
    {
        printf("%d\n",p->data);
        p=p->next;
    }   
}
 LinkList CreatFromTail(LinkList L)
{
free(L);
Node* r,* s;
r=L->next;
int flag=1;
int c;
printf("结束时请输入1000请输入\n");
 while(flag)
  {
    scanf("%d",&c);
    if(c!=1000)
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=c;
        r->next=s;
        r=s;
    }
   else
     {
    flag=0;
    r->next=NULL;

     }
  }
  return(L);
}

void RelectSortRiseList(LinkList L)
{  
    Node *first,*tail,*p,*pr,*min;
    first=NULL;
    while(L!=NULL)//当所有节点排序后都会脱离原来的链表,都脱离后原链表为空 结束循环
    {
        for(p=L,min=L;p->next!=NULL;p=p->next)
     {
        if(p->next->data<min->data)
        {
        pr=p;
        min=p->next;//p->next是最小值所在的节点。   
        }
     } //for循环是为找到最小值所在的节点
     if(first==NULL)
     {
         first=min;
         tail=min;
      } //有序链表中无节点时。
      else
      {
          tail->next=min;
          tail=min;
      }//if结构是为让最小值节点插入有序链表中
      if(min==L)
      {
          L=L->next;
       } //找到的最小节点是首节点时
       else
       {
           pr->next=min->next;
        } //if结构是为了让最小值节点脱离原来的链表
   }
   if(first!=NULL)
   {
       tail->next=NULL;
   }
   L=first;
   
 }
 
LinkList MergeLinkList()
{
    LinkList pa,pb,r;
    LinkList LC,LA,LB;
    InitList(&LC);
    InitList(&LA);
    printf("请建立链表LA\n");
    LA=CreatFromTail(LA);
    printf("\n请建立链表LB\n");  
    LB=CreatFromTail(LB);
    RelectSortRiseList(LA);
    RelectSortRiseList(LB);
    pa=LA->next;
    pb=LB->next;
    LC=LA;
    LC->next=NULL;
    r=LC;
    while(pa!=NULL&&pb!=NULL)
    {
   
        if(pa->data<=pb->data)
        {
            
            r->next=pa;r=pa;pa=pa->next;
        }
        else
        {
            r->next=pb;r=pb;pb=pb->next;
         }
         
    }
   
        if(pa==NULL)
         {
         r->next=pa;
          }
         else
         r->next=pb;
    PriList(LC);
         free(LB);
         return (LC);     
   
}
 
 
int main()
{
LinkList L,L1;
InitList(&L);
InitList(&L1);
 L1=MergeLinkList();
 return 0;
 }   
搜索更多相关主题的帖子: include 结构体 线性表 
2016-10-05 17:13
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:8 
#define ERROR
#define OK
这两个define没有任何实质性内容。如果你是初学编程,我不建议你这么用。这个东西通常是用在include头文件的时候为了避免重复递归互相include而设计的。当然,这两句和你的目前程序之间也没有任何联系。

程序代码:
void PriList(LinkList L)/*输出线性表内容的函数*/
{
LinkList p;
printf("\n链表内容为\n");
p=L->next;

 while(p->next!=NULL)//我还没有调试运行你的程序,没有完整看完代码,但是这个while循环我认为是有问题的,我见过带头结点的链表也见过没带头结点的,但是没见过带两个头结点的。你这里的p==L->next;然后进循环的时候你又让他先指向它的next,然后才输出。换句话说,进入这个函数的时候,程序输出的第一个数据就是L->next->next->data我相信这绝对不是你真的想要的数据。
    {
        p=p->next;
        printf("%d\n",p->data);
    }  

} 
程序代码:
 LinkList CreatFromTail(LinkList L)
{
free(L);//free函数都把L所指向的空间释放了
Node* r,* s;
r=L->next;//这里这么用就属于是传说的野指针了,因为原来L所指向的空间此前已经变成无主之物,虽然你可以访问,可以当做LinkLinst类型用,但已经是一件不受规则保护的事了。L所指的空间随时可能被其他变量覆盖使用。
int flag=1;
int c;
printf("结束时请输入1000请输入\n");

 while(flag)
  {
    scanf("%d",&c);
    if(c!=1000)
    {
        s=(Node*)malloc(sizeof(Node));
        s->data=c;
        r->next=s;
        r=s;
    }
   else
     {
    flag=0;
    r->next=NULL;

     }
  }
  return(L);
}
程序代码:
int main()
{
LinkList L,L1;
InitList(&L);   //这两个InitList貌似没起任何作用
InitList(&L1);  //比如L1,在下一行就被覆盖掉了。你申请的空间根本就没来得及使用。。
 L1=MergeLinkList();

 return 0;

 } 
...问题还有很多。。不一一举出,我也没有完全看完读懂。
你连free()函数干了什么都不了解。我相信你应该是初学指针。初学才会专门写一个InitList()函数而只是为了malloc一下而已。。其实这种写法看似省略了重复的代码,其实不利于后面读代码的人理清程序思路。每一个函数就好像一个新机器上的一个按钮似的。按钮多了看似精确高明,其实并不会让使用的人觉得好用。你在每一个声明指针的地方写一个malloc多好,别人看到那里就直接知道你定义并初始化过了。写个专门的函数,别人还得动一下脑子,想一下这个函数干嘛的。。
---------------------------
写指针的程序的时候,务必小心谨慎,你必须时时刻刻知道你写的每一个指针每一个时刻指向了哪一个元素。我很确信你并不清楚你写的代码你自己都不知道在干吗。比如:
LinkList CreatFromTail(LinkList L)中r=L->next;L->next在那个时刻其实等于NULL,也就是说r=L->next =NULL;那么后续代码你用的又都是r->next...这些都导致程序奔溃。。
---------------------------




φ(゜▽゜*)♪
2016-10-05 18:52
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 

程序代码:
#include <stdlib.h>
#include <stdio.h>

typedef  int ElemType;//设置ElemType为int的别名

typedef struct node
{
ElemType data;
struct node* next;

}Node,* LinkList; /*链表的结构体建立&命名*/

LinkList Creat(){
    LinkList L=(LinkList)malloc(sizeof(Node));
    L->data=-1;//习惯问题,我不喜欢留有未初始化的元素

    L->next=NULL;
    LinkList p=L;
    int temp;
    while(scanf("%d",&temp)!=EOF&&temp!=1000){
        p->next=(LinkList)malloc(sizeof(Node));
        p->next->data =temp;
        p=p->next;
    }

    p->next=NULL;
    return L->next;//返回不带头结点的链表。如果链表为空则返回NULL

}

int main() {
    LinkList L=Creat();
    LinkList p=L;
    while(p!=NULL){
        printf("%d*",p->data);
        p=p->next;
    }
   

    return 0;
}




φ(゜▽゜*)♪
2016-10-05 19:10



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




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

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