自己写的链表,不知道哪里出的问题。

头文件已经省略,运行总是主函数的循环出问题,不知道哪里的原因,请求指点。
struct Node
{

int h;
char name[10]; 
int score;
struct Node *next;

};
typedef struct Node NODE;
//链表结构体创建部分
NODE *Creat_Link(nmb)
{
int i=0;
NODE *heat,*tall,*pwne;
heat=(NODE *)malloc(sizeof(NODE));
if(heat==NULL)
{
printf("地址分配错误\n");
return(NULL);
}
heat->next=NULL;
tall=heat;
for(i=0;i<nmb;i++)
{
pwne=(NODE *)malloc(sizeof(NODE));
if(pwne==NULL)
{
printf("地址分配错误\n");
return(NULL);
}
scanf("%d%s%d",&(pwne->h),(pwne->name),&(pwne->score));
pwne->next=NULL;
tall->next=pwne;
tall=pwne;

 }
return heat;

}

//链表创建部分
void Print_Link(NODE* heat)
{
NODE* p=heat;
printf("输出结果为:\n");
printf("学号 姓名 分数\n");
while(p->next!=NULL)
{
p=p->next;
printf(" %d ",p->h);
printf(" %s ",p->name);
printf(" %d\n",p->score);

}

}

//链表打印部分
NODE ChaR(NODE heat,int h)
{
int i=0;
NODE* p=heat;
NODE tall;
NODE
q;
NODE NeN=(NODE)malloc(sizeof(NODE));
NeN->next=NULL;
printf("插入元素为:\n");
scanf("%d%d",&(NeN->h),(NeN->name),&(NeN->score));
for(i=0;i<h;i++)
{
p=p->next;
}
q->next=p->next;
tall=p;
tall->next=NeN;
tall=NeN;
NeN->next=q->next;

}
//链表插入部分

void Dele_Link(NODE* heat,int a)
{
int i=0;
NODE* p=heat;
NODE* q;
NODE* w;
for(i = 1;i < a-1;i++)
{
p=p->next;
}
q=p;
p=p->next;
w=p->next;

q->next=w;

}

int main()
{
NODE* heat;
int nub;
int a=1;
int h;
printf("输入链表数为:\n");
scanf("%d",&nub);
printf("请输入链表元素,包括学号和分数\n");
heat = Creat_Link(nub);

Print_Link(heat);
while(a)
{
printf("是否插入元素或者删除某个元素,添加元素填'1',删除元素填'2',都不则填入'0'.\n"); 
scanf("%d",&a);
if(a==1)
{

    printf("插入元素在哪一位的后边:\n");
    scanf("%d",&h);
    ChaR(heat,h);
}
else if(a==2)
{
    printf("请输入要删除的结点:\n");
    scanf("%d",&h);
    Dele_Link(heat,h);
}

Print_Link(heat);
else
break;
}
return 0;

}

修改处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
struct Node
{
    int  h;
    char name[10];
    int  score;
    struct Node *next;
};
typedef struct Node NODE;
//链表结构体创建部分
NODE *Creat_Link(int nmb) //NODE *Creat_Link(nmb) 修改
{
    int i=0;
    NODE *heat,*tall,*pwne;
    heat=(NODE *)malloc(sizeof(NODE));
    if(heat==NULL)
    {
       printf("地址分配错误\n");
       return(NULL);
    }
    heat->next=NULL;
    tall=heat;
    for(i=0;i<nmb;i++)
    {
        pwne=(NODE *)malloc(sizeof(NODE));
        if(pwne==NULL)
        {
           printf("地址分配错误\n");
           return(NULL);
        }
        scanf("%d%s%d",&pwne->h,pwne->name,&pwne->score); //修改
        //scanf("%d%s%d",&(pwne->h),(pwne->name),&(pwne->score));
        pwne->next=NULL;
        tall->next=pwne;
        tall=pwne;
    }
    return heat;
}//链表创建部分


void Print_Link(NODE* heat) //链表打印部分
{
    NODE* p=heat;
    printf("输出结果为:\n");
    printf("学号 姓名 分数\n");
    while(p->next!=NULL)
    {
        p=p->next;
        printf(" %d ",p->h);
        printf(" %s ",p->name);
        printf(" %d\n",p->score);
    }
}


void ChaR(NODE* heat,int h) //链表插入部分
//NODE ChaR(NODE* heat,int h)  修改
{
    int i=0;
    NODE* p=heat;
                           // NODE* tall; 修改
                           // NODE* q;    修改
    if (h < 1)  return;
    NODE* NeN=(NODE*)malloc(sizeof(NODE));
    NeN->next=NULL;
    printf("插入元素为(学号 姓名 成绩):\n");
    scanf("%d%s%d",&NeN->h,NeN->name,&NeN->score); //修改
    //scanf("%d%d",&(NeN->h),(NeN->name),&(NeN->score));
    for(i=0;p->next && i < h;i++) //修改
    //for(i=0;i<h;i++)
    {
        p=p->next;
    }
    //q = p->next;  修改
    //tall=p;       修改
    //tall->next=NeN;修改
    //tall=NeN;      修改
    if (p->next != NULL){
        NeN->next=p->next;//修改
    }
    p->next = NeN;    //修改
}


void Dele_Link(NODE* heat,int a) //删除链表
{
    int i=0;
    NODE* p=heat;
    NODE* q;
                  //NODE* w; 修改
    if (a < 1)  return;
    for(i = 0;p->next && i < a - 1;i++) //修改
    //for(i = 1;i < a-1;i++)
    {
       p=p->next;
    }
    //q=p;          //修改
    if (!p->next) return; //修改
    q = p->next;
    p->next = q->next;//修改
    //q->next=w;   //修改
    free(q);       //修改
}

int main()
{
    NODE* heat;
    int nub;
    int a=1;
    int h;
    printf("输入链表数为:\n");
    scanf("%d",&nub);
    printf("请输入链表元素,包括学号 姓名 分数\n");
    heat = Creat_Link(nub);

    Print_Link(heat);
    while(a)
    {
        printf("是否插入元素或者删除某个元素,添加元素填'1',删除元素填'2',都不则填入'0'.\n");
        scanf("%d",&a);
        if(a==1)
        {
            printf("输入插入元素的位置:\n"); //修改
            scanf("%d",&h);
            ChaR(heat,h);
        }
        else if(a==2)
        {
            printf("请输入要删除的结点位置:\n"); //修改
            scanf("%d",&h);
            Dele_Link(heat,h);
        }
        Print_Link(heat);
        //else        修改
        //break;      修改
    }
    return 0;
}