| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 764 人关注过本帖
标题:调用指针时出错了。。出现令我头疼的空指针问题
只看楼主 加入收藏
lx677677
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-5-31
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:15 
调用指针时出错了。。出现令我头疼的空指针问题
图片附件: 游客没有浏览图片的权限,请 登录注册



调试图片如上。。

下面是函数。

程序代码:
void search_book(pbook head)
{
    int choice;
    pbook ptr4;
    char bookname[30];
    long booknum;

    ptr4=head;

    printf("请输入查找方式");
    printf("1、按书号查找");
    printf("2、按书名查找");
    printf("0、退出");
    scanf("%d",&choice);

    if(choice==1)
    {
        scanf("%ld",&booknum);
        while( ptr4->num!=booknum || ptr4->next!=NULL)
        {
            ptr4=ptr4->next;
        }
    
        if(!(ptr4->next))
        {
            printf("输入书号有错,请重新输入\n");
            return_book(head);
        }
        printf("%ld%3.30s%4.ld%3.10s%2.d",ptr4->num,ptr4->name,ptr4->stu_num,ptr4->stu_name,ptr4->lent_out);

        {
            int choice1;
            printf("继续查询输入1,退出查询输入0");
            scanf("%d",&choice1);
            if(choice1)
                search_book(head);
            else
                return ;
        }
    }

    else if(choice==2)
    {
        scanf("%s",bookname);
        while( strcmp(ptr4->name,bookname)!=0 || ptr4->next!=NULL)
        {
            ptr4=ptr4->next;
        }

        if(!(ptr4->next))
        {
            printf("输入书号有错,请重新输入\n");
            return_book(head);
        }

        printf("%ld  %3.30s  %4.ld  %3.10s  %2.d  %d",ptr4->num,ptr4->name,ptr4->stu_num,ptr4->stu_name,ptr4->lent_out);
        {
            int choice1;
            printf("继续查询输入1,退出查询输入0");
            scanf("%d",&choice1);
            if(choice1)
                search_book(head);
            else
                return ;
        }
    }
}


究竟是什么问题啊?最近老遇到这种问题。。。。头痛死了。
搜索更多相关主题的帖子: color 
2011-06-03 00:42
lx677677
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-5-31
收藏
得分:0 
没人吗?。。。。求助啊。。。。
2011-06-03 12:42
jinzhu0505
Rank: 2
等 级:论坛游民
帖 子:24
专家分:35
注 册:2010-10-16
收藏
得分:10 
主函数呢?Pbook是什么变量的定义啊?
2011-06-03 15:01
jinzhu0505
Rank: 2
等 级:论坛游民
帖 子:24
专家分:35
注 册:2010-10-16
收藏
得分:0 
把第四行的Pbook ptr4改成Pbook *ptr4试一下!
2011-06-03 15:06
lx677677
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-5-31
收藏
得分:0 
以下是引用jinzhu0505在2011-6-3 15:01:08的发言:

主函数呢?Pbook是什么变量的定义啊?


pbook是结构体指针

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

typedef struct node{
    long num;
    char name[30];
    long stu_num;
    char stu_name[10];
    int lent_out;
    
    struct node *next;
    struct node *pioneer;
}book,*pbook;

FILE *fp;

int insert_newbook(pbook head,int count);      
int delete_book(pbook head,int count);          
void lendout_book(pbook head);         
void return_book(pbook head);          
void search_book(pbook head);          
void printf_bookinfo(pbook head);      
void reserve_book(pbook head,long count);   
void warning(pbook head,long count);        


int creat_bookinfofile()
{
    //fp=fopen("librarymaster.dat","a+");
    if((fp=fopen("librarymaster.dat","ab+"))!=NULL)
    {
        return 1;
    }
    else
        return 0;
}
pbook creat_node(void)
{
    pbook head;
    head=(pbook)malloc(sizeof(book));
    if(head)
        head->next=NULL;
    return head;
}

int main(void)
{
    int choice,i;
    pbook head,newdata,tail;
    char a[4],bookname[30],studentname[10];
    int booknum,studentnum,lentout;
    long size,len,count;

    head=creat_node();

    if(creat_bookinfofile())
        printf("新建成功\n");
    else
    {
        printf("打开失败,系统将关闭\n");
        system("pause");
        exit(0);
//        goto exitbookmaster;
    }

    fseek(fp,0L,SEEK_END); 
    len=ftell(fp);
    size=sizeof(book);
    count=len/size;
    fseek(fp,0L,SEEK_SET);

    tail=(pbook)malloc(sizeof(book));
    head->next=tail;
    tail->pioneer=head;
    tail->next=NULL;

    for(i=1;i<=count;i++)
    {
//        fseek(fp,size,SEEK_CUR);
        newdata=(pbook)malloc(sizeof(book));
        fread(newdata,size,1,fp);

        newdata->next=tail;
        newdata->pioneer=tail->pioneer;
        tail->pioneer->next=newdata;
        tail->pioneer=newdata;
    }

    clearerr(fp);

    if(fclose(fp))
    {
        printf("关闭文件失败,强制退出程序\n");
        system("pause");
        //goto exitbookmaster;
        exit(0);
    }

    do{
    
        printf("╔══════════════════════════════════╗\n");
        printf("║                    欢迎使用图书管理系统㊣by 罗枭                   ║\n");
        printf("╠══════════════════════════════════╣\n");
        printf("║1、新增图书信息                                      2、删除图书信息║\n");
        printf("║3、图书借出                                          4、图书归还    ║\n");
        printf("║5、搜索图书                                          6、显示图书信息║\n");
        printf("║7、保存图书信息                                      0、退出管理系统║\n");
        printf("╚══════════════════════════════════╝\n");
    
        scanf("%d",&choice);

        switch(choice)
        {
        case 1:count=insert_newbook(head,count);       break;
        case 2:count=delete_book(head,count);          break;
        case 3:lendout_book(head);                     break;
        case 4:return_book(head);                      break;
        case 5:search_book(head);                      break;
        case 6:printf_bookinfo(head);                  break;
        case 7:reserve_book(head,count);               break;
        case 0:warning(head,count);                    break;
        }

        system("cls");
        printf("您刚才已进行操作 %d\n",choice);

    }while(choice!=0);

    fclose(fp);
    
    system("pause");
    return 0;
}


这个就是主函数
2011-06-03 15:07
lx677677
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-5-31
收藏
得分:0 
以下是引用jinzhu0505在2011-6-3 15:01:08的发言:

主函数呢?Pbook是什么变量的定义啊?


pbook是结构体指针

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

typedef struct node{
    long num;
    char name[30];
    long stu_num;
    char stu_name[10];
    int lent_out;
    
    struct node *next;
    struct node *pioneer;
}book,*pbook;

FILE *fp;

int insert_newbook(pbook head,int count);      
int delete_book(pbook head,int count);          
void lendout_book(pbook head);         
void return_book(pbook head);          
void search_book(pbook head);          
void printf_bookinfo(pbook head);      
void reserve_book(pbook head,long count);   
void warning(pbook head,long count);        


int creat_bookinfofile()
{
    //fp=fopen("librarymaster.dat","a+");
    if((fp=fopen("librarymaster.dat","ab+"))!=NULL)
    {
        return 1;
    }
    else
        return 0;
}
pbook creat_node(void)
{
    pbook head;
    head=(pbook)malloc(sizeof(book));
    if(head)
        head->next=NULL;
    return head;
}

int main(void)
{
    int choice,i;
    pbook head,newdata,tail;
    char a[4],bookname[30],studentname[10];
    int booknum,studentnum,lentout;
    long size,len,count;

    head=creat_node();

    if(creat_bookinfofile())
        printf("新建成功\n");
    else
    {
        printf("打开失败,系统将关闭\n");
        system("pause");
        exit(0);
//        goto exitbookmaster;
    }

    fseek(fp,0L,SEEK_END); 
    len=ftell(fp);
    size=sizeof(book);
    count=len/size;
    fseek(fp,0L,SEEK_SET);

    tail=(pbook)malloc(sizeof(book));
    head->next=tail;
    tail->pioneer=head;
    tail->next=NULL;

    for(i=1;i<=count;i++)
    {
//        fseek(fp,size,SEEK_CUR);
        newdata=(pbook)malloc(sizeof(book));
        fread(newdata,size,1,fp);

        newdata->next=tail;
        newdata->pioneer=tail->pioneer;
        tail->pioneer->next=newdata;
        tail->pioneer=newdata;
    }

    clearerr(fp);

    if(fclose(fp))
    {
        printf("关闭文件失败,强制退出程序\n");
        system("pause");
        //goto exitbookmaster;
        exit(0);
    }

    do{
    
        printf("╔══════════════════════════════════╗\n");
        printf("║                    欢迎使用图书管理系统㊣by 罗枭                   ║\n");
        printf("╠══════════════════════════════════╣\n");
        printf("║1、新增图书信息                                      2、删除图书信息║\n");
        printf("║3、图书借出                                          4、图书归还    ║\n");
        printf("║5、搜索图书                                          6、显示图书信息║\n");
        printf("║7、保存图书信息                                      0、退出管理系统║\n");
        printf("╚══════════════════════════════════╝\n");
    
        scanf("%d",&choice);

        switch(choice)
        {
        case 1:count=insert_newbook(head,count);       break;
        case 2:count=delete_book(head,count);          break;
        case 3:lendout_book(head);                     break;
        case 4:return_book(head);                      break;
        case 5:search_book(head);                      break;
        case 6:printf_bookinfo(head);                  break;
        case 7:reserve_book(head,count);               break;
        case 0:warning(head,count);                    break;
        }

        system("cls");
        printf("您刚才已进行操作 %d\n",choice);

    }while(choice!=0);

    fclose(fp);
    
    system("pause");
    return 0;
}


这个就是主函数
2011-06-03 15:07
jinzhu0505
Rank: 2
等 级:论坛游民
帖 子:24
专家分:35
注 册:2010-10-16
收藏
得分:0 
恩 我再看看 然后再交流
2011-06-03 15:11
lx677677
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2011-5-31
收藏
得分:0 
以下是引用jinzhu0505在2011-6-3 15:06:30的发言:

把第四行的Pbook ptr4改成Pbook *ptr4试一下!


可是下面这段代码却能正确运行啊。

程序代码:
int insert_newbook(pbook head,int count)
{
    long booknum,studentnum;
    char bookname[30],studentname[10];
    int lentout,choice=1;
    pbook newbook,ptr1;

    while(choice)
    {
        printf("请按顺序分别输入 新书号、新书名:\n");
        scanf("%ld%s",&booknum,bookname);

        if(newbook=(pbook)malloc(sizeof(book)))
            printf("空间申请成功\n");
    
        newbook->num=booknum;                
        strcpy(newbook->name,bookname);        
        newbook->stu_num=0;                    
        strcpy(newbook->stu_name,"null");      
        newbook->lent_out=0;                   
        ptr1=head;                              
        
        while(ptr1->next)
        {
            if(booknum<=0)
            {
                printf("输入的书号有错\n");
                break;
            }                                  

            if(ptr1->next->next==NULL)
            {
                newbook->pioneer=ptr1;
                newbook->next=ptr1->next;
                ptr1->next->pioneer=newbook;
                ptr1->next=newbook;
                count++;
                break;
            }                                  
            
            else
            {
                if( (newbook->num) > (ptr1->num) && (newbook->num) < (ptr1->next->num) )
                {
                    newbook->pioneer=ptr1;
                    newbook->next=ptr1->next;
                    ptr1->next->pioneer=newbook;
                    ptr1->next=newbook;
                    count++;
                    break;
                }
                else if( (newbook->num) < (ptr1->num) && (newbook->num) > (ptr1->pioneer->num) )
                {
                    newbook->next=ptr1;
                    newbook->pioneer=ptr1->next;
                    ptr1->pioneer->next=newbook;
                    ptr1->pioneer=newbook;
                    count++;
                    break;
                }
            }
            ptr1=ptr1->next;
        }
        printf("请选择:1、继续添加新书    0、退出添加新书\n");
        scanf("%d",&choice);
        if(!choice)
            break;
    }
    reserve_book(head,count);
    return count;
}




两个都是先声明 pbook ptr;  然后就ptr=head。上面这段代码能正确赋值
2011-06-03 15:12
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:10 
while( ptr4->num!=booknum && ptr4->next!=NULL)

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2011-06-03 15:27
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
从||改为&&

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2011-06-03 15:27
快速回复:调用指针时出错了。。出现令我头疼的空指针问题
数据加载中...
 
   



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

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