错在哪里呢 找不出来了

请问大家错在哪里,,
是用来求1000以内素数的 谢谢!

#include<stdio.h>
#include<stdlib.h>
typedef struct PRIME_LINK
{
    int prime;
    struct PRIME_LINK* next;
     
}su;

int panduan(int a)
{
    int i;
    for(i=2;i<a/2;i++)
    {
        if(a%i==0) return 0;
    }
    return 1;
}

int main()
{
    int i,n;
    su* p1,*p2,*head;
    p2=(su*)malloc(sizeof(su));
    for(i=2,n=0;i<1000;i++)
    {
        if(i==2||i==3||panduan(i)==1)
        {
            p1=(su*)malloc(sizeof(su));
            p1->prime=i;
            if(n==0) head=p1;
            else p2->next=p1; 
            p2=p1;
            n++;
        }
        
    }
    for(i=0;i<=n;i++)
    {
        printf("%d ",(head+i)->prime);
    }
}

你既然定义的是链表而不是数组,访问的时候为什么不写while+next,而是用head+i,地址是连续的吗你就+i
再说你建立链表的代码本身也是错的
p1为什么没有挂在头结点后面而是挂到p2后面去了,那head应该指向p2才对呀
head=p2=(su*)malloc(sizeof(su));这样就行了,不要到for循环里面再判断

使用链表地址不一定是连续的,所以遍历时候要进行指向下一个地址的操作,而不是head+i

最后打印的循环函数改一下

    su* p = head;
    while (p != p2->next)
    {
        printf("%d ", p->prime);
        p = p->next;
    }