| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:一个简单的程序问题,编译无错误,但运行时提示运行错误,求指出错误
只看楼主 加入收藏
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:2 
一个简单的程序问题,编译无错误,但运行时提示运行错误,求指出错误
可以不必仔细看完所有代码。我已经标记了错误范围,而且做了注释,如果有哪里觉得不明白可以问我,多谢指教
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
/*这是一个从a链表删去和b链表有相同学号的那些结点的程序*/
int n;
struct Student
{
    int num;
    float score;
    struct Student *next;
};
struct Student*creat(void)//这个函数没有错误,不用检查
{
    struct Student*head;
    struct Student*p1,*p2;
    n=0;
    p1=p2=(struct Student*)malloc(LEN);
    scanf("%d,%f",&p1->num,&p1->score);
    head=NULL;
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
        head=p1;
        else p2->next=p1;
        p2=p1;
        p1=(struct Student*)malloc(LEN);
        scanf("%d,%f",&p1->num,&p1->score);
    }
    p2->next=NULL;
    return(head);
}
struct Student *del(struct Student *p,int a,int temp)//删除第 a个结点
{
    struct Student *q=p,*head=p;
    int i;
    for(i=1;i<=temp;i++)
    {
        if(a==1)
        {
            head=p->next;
            break;
        }
        if(i<=a-2)
        {
            p=p->next;//p是所选结点前一个结点的地址
        }   
        if(i<=a)
        {
            q=q->next;//q是所选结点后一个结点的地址
        }
    }
    if(a==temp)
    p->next=NULL;
    else p->next=q;
    return head;
}
void print(struct Student *head)//输出链表的函数
{
    struct Student *p;
    printf("\n Now,These %d records are:\n",n);
    p=head;
    if(head!=NULL)
    do
    {
        printf("%d,%f\n",p->num,p->score);
        p=p->next;
    }while(p!=NULL);
}
int main()
{
    int i,j,n1,temp;
    struct Student *head1,*head2,*p,*q;
    printf("please input a and b linked list:\na list:\n");
    head1=creat();
    n1=n;//n1记录head1链表的结点个数,n记录head2链表结点个数
    print(head1);
    printf("b list:\n");
    head2=creat();
    print(head2);
    for(i=1,q=head2;i<=n;i++)//从这里开始出现了问题,提示运行错误
    {
        for(j=1,p=head1,temp=n1;j<=n1;j++)
        {
            if(q->num==p->num)
            {
             head1=del(head1,j,temp);//如果这里用n1,那么del循环里的n1将不符合实际情况,因而出错
             temp--; //这里之所以不用n1--是因为如果用了会检测不了a链表有相同学号的情况
             }
            p=p->next;
        }
        n1=temp;
        q=q->next;
    }
    print(head1);
    return 0;
}
搜索更多相关主题的帖子: include 而且 
2017-03-10 21:00
mnmn4429
Rank: 4
等 级:业余侠客
帖 子:64
专家分:245
注 册:2017-2-21
收藏
得分:20 
if(q->num==p->num)
            {
             head1=del(head1,j,temp);//如果这里用n1,那么del循环里的n1将不符合实际情况,因而出错
p 的值已经删完,p中已经没有num值了,这个错误是p越界导致的,你在考虑考虑算法和思路,应该是思路出问题了,
找一个好的思路去            
            
2017-03-11 00:05
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
收藏
得分:0 
回复 2楼 mnmn4429
首先很感谢你不辞辛苦的答复,因为最近忙所以没有逛论坛。
的确是这个问题是我粗心了

............
2017-03-13 22:55
快速回复:一个简单的程序问题,编译无错误,但运行时提示运行错误,求指出错误
数据加载中...
 
   



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

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