关于单链表的一个问题

ExtreU 发布于 2014/10/09 00:22
阅读 368
收藏 0

程序不知道哪里出错,一运行就崩溃,求助?

#include"stdio.h"
#include"stdlib.h"


#define TURE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1                                  //不可执行
#define OVERFLOW   -2                                  //溢出

typedef int status;
typedef int Elemtype;                                  //将抽象数据类型Elemtype具体化为int类型

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;                                      //结点定义

status GetElem_L(LinkList L,int i, Elemtype &e){       
    int j;
    LNode *p;
    p=L->next;j=1;                                     //初始化,p为第一个结点,j为记数器
    while(p&&j<i){
        p=p->next;++j;
    }
    if(!p||j>i) return ERROR;                          //第i个元素不存在
    e=p->data;                                         //取第i个元素
    return OK;
}//查询函数
status ListInsert_L(LinkList &L,int i,Elemtype e){
    int j;
    LNode *p,*s;
    p=L;j=0;
    while(p&&j<i-1){p=p->next;++j;}                    //寻找第i-1个结点
    if(!p||j>i-1) return ERROR;                        //i小于1或者大于表长加1
    s=(LinkList)malloc(sizeof(LNode));                 //生成新结点
    s->data=e;s->next=p->next;                         //插入L中
    p->next=s;
    return OK;
}//插入函数
status ListDelete_L(LinkList &L,int i,Elemtype &e){    
    int j;
    LNode *p,*q;
    p=L;j=0;
    while(p->next&&j<i-1){                             //寻找第i个结点,并令p指向其前驱
        p=p->next;++j;
    }
    if(!(p->next)||j>i-1) return ERROR;                //删除位置不合理
    q=p->next;p->next=q->next;                         //删除并释放结点
    e=q->data;free(q);
    return OK;
}//删除函数
status ListPrintf_L(LinkList &L,int i){
    int j;
    LNode *p;
    p=L;j=1;
    printf("学生成绩:\n");
    while(p&&j<i){
        printf("学号为%d号的成绩为:\t",j);
        printf("%d",p->data);
        p=p->next;
        ++j;
    }
    if(!p||j>i) return ERROR;                          //第i个元素不存在
    return OK;
}//输出函数
void CreateList_L(LinkList &L,int n){
    int i;
    LNode *p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;                                      //先建立一个带头结点的单链表
    for(i=n;i>0;--i){
        p=(LinkList)malloc(sizeof(LNode));             //生成新结点
        scanf("%d",&p->data);                          //输入元素值
        p->next=L->next;L->next=p;                     //插入到表头
    }
}//修改函数
void SortList_L(LinkList &La,LinkList &Lb){            
    LinkList pa,pb,pc,Lc=La;
    pa=La->next;pc=Lc->next;
    Lb=pb=La;                                          //用La的头结点做Lb的头结点
    while(pa&&pc){
        if(pa->data<=pc->data){
        pb->next=pa;pb=pa;pa=pa->next;
        }
        else{pb->next=pc;pb=pc;pc=pb->next;}
    }
    pb->next=pa?pa:pc;                                 //插入剩余段
    free(Lc);                                          //释放Lc的头结点
}//排序函数

void main(){
    LinkList list1=NULL,list2=NULL;
    int mark[8][2]={{1,70},{2,85},{3,75}, {4,90},{5,60},{6,80}, {7,76},{8,50}};
    int i,j=8,id;
    Elemtype score;
    for(i=1;i<=8;i++)
          GetElem_L(list1,i,mark[i][1]);//此处有错
    ListPrintf_L(list1,j);
    /*增加学生成绩*/
    printf("请输入要添加的学生学号:");
    scanf("%d",&id);
    printf("请输入要添加的学生成绩:");
    scanf("%d",&score);
    ListInsert_L(list1,id,score);j++;
    ListPrintf_L(list1,j);
    /*修改学生成绩*/
    printf("请输入要修改的学生学号:");
    scanf("%d",&id);
    CreateList_L(list1,id);
    ListPrintf_L(list1,j);
    /*删除学生成绩*/
    printf("请输入要删除的学生学号:");
    scanf("%d",&id);
    ListDelete_L(list1,id,score);j--;
    ListPrintf_L(list1,j);
    /*成绩低到高排序*/
    SortList_L(list1,list2);
    ListPrintf_L(list2,j);
}

加载中
0
风之轮
风之轮
你需要先创建一个链表list1,你现在使用的是未初始化的
中山野鬼
中山野鬼
哈。至少这是个错。
0
loki_lan
loki_lan
好久不写C了,帮你@中山野鬼
0
excepiton
excepiton
GetElem_L 的L指向null,L->next出错
0
雨翔河
雨翔河
LinkList list1=NULL,list2=NULL;

GetElem_L(list1,i,mark[i][1]);

status GetElem_L(LinkList L,int i, Elemtype &e){       
    int j;
    LNode *p;
    p=L->next;j=1;                                     //初始化,p为第一个结点,j为记数器
    while(p&&j<i){
        p=p->next;++j;
    }
    if(!p||j>i) return ERROR;                          //第i个元素不存在
    e=p->data;                                         //取第i个元素
    return OK;
}//查询函数

//L指向的next,很明显L是空的,那么它的next会是啥?

//好久没接触c,但是看到这儿,你应该能明白了吧



0
中山野鬼
中山野鬼
代码的错误是小错。代码开发步骤的错误是大错。楼主明显没有对对象进行创建和释放测试后就开始利用。难道代码只是抄来的?
中山野鬼
中山野鬼
回复 @tb_engineer : ????是否用了呢?
tb_engineer
tb_engineer
Void CreateList_L(LinkList &L,int n){ 不是吗????
返回顶部
顶部