新手使用链表过程中遇到一个问题

exist函数里

执行for循环,执行到链表末尾的时候,curt1=curt1->next 之后应该已经为空了,为什么还会进入这个for循环
然后进行循环里第一个if比较的时候就报错了,,,,感觉是个挺脑残的问题,无奈我链表用的不熟练,完全不知道怎么解决

求指点!thx

#include<stdio.h>
#include<windows.h>
#define MAX 8

int temp[MAX];
int allcount=0;

typedef struct result{
    int num[MAX];
    struct result* next;
}*rst;

rst head=NULL;
rst last;
rst curt;

void print()
{
    int count;
    for(curt=head;curt!=NULL;curt=curt->next)
    {
        for(count=0;count<MAX;count++)
        {
            printf("%d",curt->num[count]);
        }
        printf("\n");
    }
}

int exist()
{
    rst curt1;
    int count1;
    int exist=1;
    if(head==NULL)
    {
        return 0;
    }
    for(curt1=head;curt1!=NULL;curt1=curt1->next)
    {
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=temp[count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=temp[MAX-1-count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=MAX-1-temp[count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=MAX-1-temp[MAX-1-count1])
            {
                exist=0;
                break;
            }
        }
        if(exist==1)
        {
            return 1;
        }
        exist=1;
    }
    return 0;
}

void work(int current)
{
    int x,count;

    for(x=0;x<MAX;x++)
    {
        if(temp[x]==-1)//x暂时有用 
        {
            temp[x]=current;
            if(current==MAX-1)
            {
                allcount++;//test
                if(exist()==1)
                {
                    if(head==NULL)
                    {
                        head=(rst)malloc(sizeof(struct result));
                        curt=head;
                        for(count=0;count<MAX;count++)
                        {
                            head->num[count]=temp[count];
                        }
                    }
                    else
                    {
                        last=curt;
                        curt=(rst)malloc(sizeof(struct result));
                        last->next=curt;
                        for(count=0;count<MAX;count++)
                        {
                            curt->num[count]=temp[count];
                        }
                    }
                }

            }
            else
            {
                work(current+1);
            }
            temp[x]=-1;
        }
    }
}


int main(void)
{
    int count;
    for(count=0;count<MAX;count++)
    {
        temp[count]=-1;
    }
    work(0);
    printf("%d",allcount);
    print();
}

2个回答

head=(rst)malloc(sizeof(struct result));
curt=(rst)malloc(sizeof(struct result));
之后分别加上
head->next = NULL;
curt->next = NULL;
否则next是随机值

Deadpixels
涼宮こなた 感谢!解决了
12 个月之前 回复

完整代码

 #include<stdio.h>
#include<windows.h>
#define MAX 8

int temp[MAX];
int allcount=0;

typedef struct result{
    int num[MAX];
    struct result* next;
}*rst;

rst head=NULL;
rst last;
rst curt;

void print()
{
    int count;
    for(curt=head;curt!=NULL;curt=curt->next)
    {
        for(count=0;count<MAX;count++)
        {
            printf("%d",curt->num[count]);
        }
        printf("\n");
    }
}

int exist()
{
    rst curt1;
    int count1;
    int exist=1;
    if(head==NULL)
    {
        return 0;
    }
    for(curt1=head;curt1!=NULL;curt1=curt1->next)
    {
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=temp[count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=temp[MAX-1-count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=MAX-1-temp[count1])
            {
                exist=0;
                break;
            }
        }
        for(count1=0;count1<MAX;count1++)
        {
            if(curt1->num[count1]!=MAX-1-temp[MAX-1-count1])
            {
                exist=0;
                break;
            }
        }
        if(exist==1)
        {
            return 1;
        }
        exist=1;
    }
    return 0;
}

void work(int current)
{
    int x,count;

    for(x=0;x<MAX;x++)
    {
        if(temp[x]==-1)
        {
            temp[x]=current;
            if(current==MAX-1)
            {
                allcount++;//test
                if(exist()==1)
                {
                    if(head==NULL)
                    {
                        head=(rst)malloc(sizeof(struct result));
                        curt=head;
                        for(count=0;count<MAX;count++)
                        {
                            head->num[count]=temp[count];
                        }
                    }
                    else
                    {
                        last=curt;
                        curt=(rst)malloc(sizeof(struct result));
                        last->next=curt;
                        for(count=0;count<MAX;count++)
                        {
                            curt->num[count]=temp[count];
                        }
                    }
                }

            }
            else
            {
                work(current+1);
            }
            temp[x]=-1;
        }
    }
}


int main(void)
{
    int count;
    for(count=0;count<MAX;count++)
    {
        temp[count]=-1;
    }
    work(0);
    printf("%d",allcount);
    print();
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!