标题:自己写的链表操作,帮检查一下哪错了。。。运行时会崩溃
只看楼主
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
回复 8楼 lansane
那你改一下

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2011-10-04 17:49
lansane
Rank: 2
等 级:论坛游民
帖 子:17
专家分:58
注 册:2011-5-19
得分:0 
回复 9楼 fourleaves
实参的初始化能放到调用函数里?
La和Lb的默认值所指的地址是不能访问的,
你把不能访问的地址给createlist()肯定崩溃
2011-10-04 17:49
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
回复 12楼 lansane
那么方便给我改一下吗

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2011-10-04 17:56
lansane
Rank: 2
等 级:论坛游民
帖 子:17
专家分:58
注 册:2011-5-19
得分:0 
我改了点。还有点问题。现在有事你自己再改改吧
#include <stdio.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef struct L1{
    int data;
  struct L1 *next;
}LNode,*Linklist;
int num=0;
int GetElem(Linklist L,int i,int e)//Getelem
{
    Linklist p;
    int j;               //
    p=L->next;                     //
    j=1;
    while(p!=NULL&&j<i)            //
    {
        p=p->next;                 //
        ++j;
    }
    if(!p||j>i) return ERROR;     //
    num=p->data;                    //
    return OK;                    //
}//Getelem

int ListInsert(Linklist L,int i,int e)  //ListInsert
{
    Linklist p;int j=0;Linklist s;
    p=L;
   
    while(p!=NULL&&j<i-1)  //GPS i position
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1) return ERROR;
    s=(Linklist)malloc(sizeof(LNode));
    s->data=e;s->next=p->next;
    p->next=s;
    return OK;
   
}   //ListInsert

int ListDel(Linklist L,int i)
{
    Linklist p,q;int j=0;
    p=L;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return ERROR;
    q=p->next;
    p->next=q->next;
    free(q);
} //ListDel

void CreatLinklist(Linklist L,int n) //CreatLinklist
{
    Linklist p,q;
    int i;                    
    p=L;                                //p 指向 L
  //  L=(Linklist)malloc(sizeof(LNode));   // 初始化头节点
   // L->next=NULL;
    for(i=1;i<=n;i++)                     //创建N个节点,并录入数据
     {
         q=(Linklist)malloc(sizeof(LNode));
         printf("请输入数据\n");
         scanf("%d",&(q->data));
        p->next=q;
        p=p->next;
        q->next=NULL;
     }
}  //CreatLinklist

void print(Linklist L)
{
    Linklist p=L;
    p=p->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}


void MergeList(Linklist La,Linklist Lb,Linklist Lc)
{
    Linklist pa,pb,pc;
    pa=La->next;pb=Lb->next;
    Lc=pc=La;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            
   
        pc->next=pa;
        pc=pa;
        pa=pa->next;
       }
       else
       {
           pc->next=pb;
           pc=pb;
           pb=pb->next;
          }
          pc->next=pa?pa:pb;
          free(Lb);
    }
   
    print(Lc);
   
}



int main()
{   
     //int num=0;
     Linklist La,Lb,Lc;
      La=(Linklist)malloc(sizeof(LNode));
      La->next=NULL;
       Lb=(Linklist)malloc(sizeof(LNode));
       Lb->next=NULL;
     CreatLinklist(La,5);
     CreatLinklist(Lb,3);
     GetElem(La,3,num);
     printf("La中的第3个数是%d",num);
     ListInsert(Lb,2,2);
     print(Lb);
     MergeList(La,Lb,Lc);
     return 0;
}
2011-10-04 18:11
lansane
Rank: 2
等 级:论坛游民
帖 子:17
专家分:58
注 册:2011-5-19
得分:1 
晚上回来再帮你改吧
2011-10-04 18:11
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
回复 15楼 lansane
thank u
在你改的基础上。。。改完了。。

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2011-10-04 18:46
fourleaves
Rank: 2
等 级:论坛游民
帖 子:194
专家分:99
注 册:2010-5-8
得分:0 
给出改后结果,大家相互学习
#include <stdio.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef struct L1{
    int data;
  struct L1 *next;
}LNode,*Linklist;
int num=0;
int GetElem(Linklist L,int i,int e)//Getelem
{
    Linklist p;
    int j;               //
    p=L->next;                     //
    j=1;
    while(p!=NULL&&j<i)            //
    {
        p=p->next;                 //
        ++j;
    }
    if(!p||j>i) return ERROR;     //
    num=p->data;                    //
    return OK;                    //
}//Getelem

int ListInsert(Linklist L,int i,int e)  //ListInsert
{
    Linklist p;int j=0;Linklist s;
    p=L;
   
    while(p!=NULL&&j<i-1)  //GPS i position
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1) return ERROR;
    s=(Linklist)malloc(sizeof(LNode));
    s->data=e;s->next=p->next;
    p->next=s;
    return OK;
   
}   //ListInsert

int ListDel(Linklist L,int i)
{
    Linklist p,q;int j=0;
    p=L;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return ERROR;
    q=p->next;
    p->next=q->next;
    free(q);
} //ListDel

void CreatLinklist(Linklist L,int n) //CreatLinklist
{
    Linklist p,q;
    int i;                    
    p=L;                                //p 指向 L
  //  L=(Linklist)malloc(sizeof(LNode));   // 初始化头节点
   // L->next=NULL;
    for(i=1;i<=n;i++)                     //创建N个节点,并录入数据
     {
         q=(Linklist)malloc(sizeof(LNode));
         printf("请输入数据\n");
         scanf("%d",&(q->data));
        p->next=q;
        p=p->next;
        q->next=NULL;
     }
}  //CreatLinklist

void print(Linklist L)
{
    Linklist p=L;
    p=p->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}


void MergeList(Linklist La,Linklist Lb,Linklist Lc)
{
    Linklist pa,pb,pc;
    pa=La->next;pb=Lb->next;
    Lc=pc=La;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            
   
        pc->next=pa;
        pc=pa;
        pa=pa->next;
       }
       else
       {
           pc->next=pb;
           pc=pb;
           pb=pb->next;
          }
          pc->next=pa?pa:pb;
          free(Lb);
    }
   
    print(Lc);
   
}



int main()
{   
     //int num=0;
     Linklist La,Lb,Lc;
      La=(Linklist)malloc(sizeof(LNode));
      La->next=NULL;
       Lb=(Linklist)malloc(sizeof(LNode));
       Lb->next=NULL;
     CreatLinklist(La,5);
     CreatLinklist(Lb,3);
     GetElem(La,3,num);
     printf("La中的第3个数是%d\n",num);
     ListInsert(Lb,2,2);
     print(Lb);
     MergeList(La,Lb,Lc);
     return 0;
}

再复杂的问题也基于最简单的原理。耐心,耐心!丰富自己!等待时机!
2011-10-04 18:47
mengcan555
Rank: 4
等 级:业余侠客
帖 子:104
专家分:253
注 册:2011-9-17
得分:0 
费了很大劲才成功,别忘了给分,代码如下:
#include <stdio.h>
#include<malloc.h>
#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef struct node{
    int data;
    node *next;
}LNode,*Linklist;


int GetElem(Linklist L,int i,int e)//Getelem
{
    Linklist p;
    int j;               //
    p=L->next;                     //
    j=1;
    while(p!=NULL&&j<i)            //
    {
        p=p->next;                 //
        ++j;
    }
    if(!p||j>i) return ERROR;     //
    e=p->data;
    return e;//
    //return OK;                    //
}//Getelem

int ListInsert(Linklist L,int i,int e)  //ListInsert
{
    Linklist p;int j=0;Linklist s;
    p=L;
   
    while(p!=NULL&&j<i-1)  //GPS i position
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1) return ERROR;
    s=(Linklist)malloc(sizeof(LNode));
    s->data=e;s->next=p->next;
    p->next=s;
    return OK;
   
}   //ListInsert

int ListDel(Linklist L,int i)
{
    Linklist p,q;int j=0;
    p=L;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1) return ERROR;
    q=p->next;
    p->next=q->next;
    free(q);
} //ListDel

void CreatLinklist(Linklist L,int n) //CreatLinklist
{
    Linklist p,q;
    int i;                    
    p=L;                                //p 指向 L
    //L=(Linklist)malloc(sizeof(LNode));   // 初始化头节点
    L->next=NULL;
    for(i=1;i<=n;i++)                     //创建N个节点,并录入数据
     {
         q=(Linklist)malloc(sizeof(LNode));
         printf("请输入数据\n");
         scanf("%d",&q->data);
        p->next=q;
        p=p->next;
        q->next=NULL;
     }
}  //CreatLinklist

void print(Linklist L)
{
    Linklist p;
   
    p=L;
    p=p->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}


void MergeList(Linklist La,Linklist Lb)
{
    Linklist pa,pb,pc,Lc;
    //pa=(Linklist)malloc(sizeof(LNode));
    //pb=(Linklist)malloc(sizeof(LNode));
    //pc=(Linklist)malloc(sizeof(LNode));
    //Lc=(Linklist)malloc(sizeof(LNode));
    pa=La->next;
    pb=Lb->next;
    Lc=La;
    pc=La;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            
   
        pc->next=pa;
        pc=pa;
        pa=pa->next;
       }
       else
       {
           pc->next=pb;
           pc=pb;
           pb=pb->next;
        }
         if(pa==NULL)
             pc->next=pb;
         else
             pc->next=pa;
       //pc->next=pa?pa:pb;
          //free(Lb);
    }
   
    print(Lc);
   
}



int main()
{   
     int num,e;
     Linklist La,Lb,Lc;
     La=(Linklist)malloc(sizeof(LNode));
     Lb=(Linklist)malloc(sizeof(LNode));
     //Lc=(Linklist)malloc(sizeof(LNode));
     CreatLinklist(La,5);
     CreatLinklist(Lb,3);
     e=GetElem(La,3,num);
     printf("La中的第3个数是%d\n",e);
     ListInsert(Lb,2,2);
     print(Lb);
     MergeList(La,Lb);
}
2011-10-04 20:04
mengcan555
Rank: 4
等 级:业余侠客
帖 子:104
专家分:253
注 册:2011-9-17
得分:0 
但是你最最后的 merge函数并不能实现从小到大排序,
example:
 la:5,9,2
 la:4,3,7
合并后输出是:4,3,5,7,9,2
若想实现排序,请遍历完整个链表
2011-10-04 20:12
zhangyin
Rank: 2
等 级:论坛游民
帖 子:22
专家分:43
注 册:2011-10-2
得分:0 
新手,最近正在学链表,表示关注!!
2011-10-04 20:38



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




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

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