C失去指针

时间:2014-12-15 21:44:53

标签: c++ c pointers struct

当我使用' 1'插入新结构A时命令(所以我已经有一个或多个struct A链接到一个或多个struct S),我丢失了前一个struct A到它们的struct S的链接。 对于exaple:

  

命令1然后命令3:2014和命令4

     

输出:

     

年:2014

     

matricola:1

     

现在命令1然后命令3:2015和命令4

     

输出:

     

年:2015

     

matricola:2

     

年:2014

     

没有S结构

我希望这个例子会有所帮助 这是代码:

#include <stdio.h>
#include <stdlib.h>

struct S
{
    int matr;
    struct S* next;
};
struct A
{
    int year;
    struct A *nextA;
    struct S *nextS;
};
int years = 2013;
int matricola=0;
void insA(struct A**T);
void printA(struct A*T);
void insS(struct A **T);
void printS(struct A *T);

int main()
{
    struct A *T=NULL;
    int cmd,sc=0;

    while(1)
    {
        printf("\n command:");
        sc=scanf("%d",&cmd);
        while(sc==0)
        {
            printf("\nerror:");
            fflush(stdin);
            sc=scanf("%d",&cmd);
        }
        if(cmd==1)
        {
            insA(&T);
        }
        if(cmd==2)
        {
            printA(T);
        }
        if(cmd==3)
        {
            insS(&T);
        }
        if(cmd==4)
        {
            printS(T);
        }
    }
    return 0;
}
void insA(struct A**T)
{
    struct A *new_p=(struct A*)malloc(sizeof(struct A));
    if(new_p==NULL)
    {
        printf("Errore");
        exit(0);
    }
    years++;
    new_p->nextA=NULL;
    new_p->nextS=NULL;

    if((*T)==NULL)
    {
        (*T)=new_p;
    }
    else
    {
        new_p->nextA=(*T);
        (*T)=new_p;
    }
    new_p->year=years;
}
void printA(struct A *T)
{
    struct A *tmp=T;
    while(tmp!=NULL)
    {
        printf("\n%d",tmp->year);
        tmp=tmp->nextA;
    }
    return;
}
void insS(struct A **T)
{
    int search,sc=0;
    struct S* new_p=(struct S*)malloc(sizeof(struct S));
    if(new_p==NULL)
    {
        printf("error");
        exit(0);
    }
    new_p->next=NULL;

    printf("\nyear in which to insert:");
    sc=scanf("%4d",&search);
    while(sc==0 || search > years || search <= 2013)
    {
        printf("\nerror:");
        fflush(stdin);
        sc=scanf("%4d",&search);
    }

    struct A*tmp=*T;
    while(tmp!=NULL)
    {
        if(tmp->year==search)
        {
            matricola++;
            if(tmp->nextS==NULL)
            {
                tmp->nextS=new_p;
            }
            else
            {
                new_p->next=tmp->nextS;
                tmp->nextS=new_p;
            }
        }
        tmp=tmp->nextA;
    }
    new_p->matr=matricola;
    return;
}
void printS(struct A *T)
{
    struct A *tmp=T;
    struct S *s=tmp->nextS;
    while(tmp!=NULL)
    {
        printf("\nyear:%d",tmp->year);
        if(s==NULL)
        {
            printf("\nno S struct");
            return;
        }
        else
        {
            while(s!=NULL)
            {
                printf("\nmatricola:%d",s->matr);
                s=s->next;
            }
        }
        tmp=tmp->nextA;
    }
}

这是我的第一篇文章,所以我为任何错误道歉。

1 个答案:

答案 0 :(得分:1)

在努力了解您想要做什么之后我想出了您的问题,您必须更改您的printS功能。

void printS(struct A *T) {
    struct A *tmp=T;
    truct S *s = tmp->nextS;

    while(tmp != NULL) {
        printf("\nyear:%d", tmp->year);

        if(s == NULL) {
            printf("\nno S struct");
            return ;
        } else {
            while(s != NULL) {
                printf("\nmatricola:%d",s->matr);
                s = s->next;
            }
        }
        tmp = tmp->nextA;
    }
}

喜欢这个。

void printS(struct A *T) {
    struct A *tmp=T;

    while(tmp != NULL) {
        struct S *s = tmp->nextS;
        printf("\nyear:%d", tmp->year);

        if(s == NULL) {
            printf("\nno S struct");
            return ;
        } else {
            while(s != NULL) {
                printf("\nmatricola:%d",s->matr);
                s = s->next;
            }
        }
        tmp = tmp->nextA;
    }
}

因为struct S *s = tmp->nextS;必须更新到你所在的实际结构A,所以它必须在while循环中,如果你将struct S *s = tmp->nextS;留在while循环之外,你会尝试打印从第一个结构A开始的结构列表S,而不是从每个结构A开始的整个结构列表S.

注意:正如我所说,尽量避免使用fflush(stdin);,因为如果参数没有指向输出流,则行为未定义。