头文件已经省略,运行总是主函数的循环出问题,不知道哪里的原因,请求指点。
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;
}