链表插入后,程序不停打印为什么?
#include<stdio.h>#include<stdlib.h>
int n;
struct student
{
int num;
float score;
struct student *next;
} ;
int main()
{
struct student * creat(void);
struct student * del(struct student *pstu, struct student *p_del_stu);
struct student * insert(struct student *pstu, struct student *p_in_stu);
void print(struct student *pstu);
struct student *stu,*stu_x;
struct student student_X;
stu_x = &student_X;
stu = creat();
print(stu);
printf("请输入需要删除的学生的学号(0结束):");
scanf_s("%d", &stu_x->num);
while (stu_x->num)
{
stu=del(stu, stu_x);
print(stu);
printf("请输入需要删除的学生的学号(0结束):");
scanf_s("%d", &stu_x->num);
}
printf("\n");
printf("请输入需要插入的学生的学号(0结束):");
scanf_s("%d", &stu_x->num);
printf("请输入需要插入的学生的成绩:");
scanf_s("%f", &stu_x->score);
stu_x->next = NULL;
while (stu_x->num)
{
stu = insert(stu, stu_x);
print(stu);
printf("请输入需要插入的学生的学号(0结束):");
scanf_s("%d", &stu_x->num);
printf("请输入需要插入的学生的成绩:");
scanf_s("%f", &stu_x->score);
stu_x->next = NULL;
}
system("pause");
return 0;
}
//生成链表函数
struct student * creat(void)
{
struct student *p1, *p2, *head;
n = 0;
p1 = p2 = (struct student *)malloc(sizeof(struct student));
printf("please input stuent number(0 to terminate):");
scanf_s("%d", &p1->num, 1);
printf("please input stuent score:");
scanf_s("%f", &p1->score, 2);
head = NULL;
while (p1->num)
{
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct student *)malloc(sizeof(struct student));
printf("please input stuent number(0 to terminate):");
scanf_s("%d", &p1->num, 1);
printf("please input stuent score:");
scanf_s("%f", &p1->score, 2);
}
p2->next = NULL;
return head;
}
//链表节点删除函数
struct student * del(struct student *pstu, struct student *p_del_stu)
{
struct student *head,*p1,*p2,*p0;
p0 = p_del_stu;
head = p1 = p2 = NULL;
if (pstu)
{
head = pstu;
p1 = head;
while (p1->num != p0->num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p1->num == p0->num)
{
if (p1 == head)
{
head = p1->next;
}
else
p2->next = p1->next;
n--;
}
else
printf("没有该学生记录\n");
}
else
printf("此表为空链表!!!\n\n");
return head;
}
//链表插入
struct student * insert(struct student *pstu, struct student *p_in_stu )
{
struct student *head,*p0, *p1, *p2;
head = p1 = pstu;
p2 = NULL;
p0 = p_in_stu;
if (head)
{
while (p0->num > p1->num &&p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p0->num <= p1->num)
{
if (p1 == head)
{
head = p0;
p0->next = p1;
}
else
{
p2->next = p0;
p0->next = p1;
}
}
else
{
p1->next = p0;
p0->next = NULL;
}
n++;
}
return head;
}
//打印函数
void print(struct student *pstu)
{
struct student *head;
head = pstu;
printf("There are %d records!!!\n", n);
while (head)
{
printf("student number = %d\n", head->num);
printf("student score= %5.2f\n\n", head->score);
head = head->next;
}
} 这代码看起纠结死人。
又中文又英文,乱七八遭的。
先整理下思路,参考一下别人的代码改下 本帖最后由 jackz007 于 2019-3-16 01:35 编辑
你的代码太乱,看起来很费劲,我又按照你的程序框架重写了全部代码供你参考。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct student
{
int num ;
float score ;
struct student * next ;
} node ;
int n ;
//链表插入
node * insert(node * pstu)
{
node * head , * p1 , * p2 ;
int num ;
float score ;
bool f ;
head = pstu ;
for(;;) {
printf("please input stuent number(0 to terminate): ") ;
scanf("%d", & num) ;
if(num == 0) {
break ;
} else {
f = true ;
p1 = p2 = head ;
while(p2 != NULL) {
if(p2 -> num == num) {
f = false ;
break ;
} else {
p1 = p2 ;
p2 = p1 -> next ;
}
}
if(f) {
printf("please input stuent score: ") ;
scanf("%f", & score) ;
p2 = (node *) malloc(sizeof(node)) ;
if(p2 != NULL) {
p2 -> num = num ;
p2 -> score = score ;
p2 -> next = NULL ;
if(! n) head = p2 ;
else p1 -> next = p2 ;
n ++ ;
} else {
fprintf(stderr , "error : allocate memory operation failure !\n") ;
}
} else {
printf("抱歉,学号为 %d 的学生已经存在!\n" , num) ;
}
}
}
return head ;
}
//链表节点删除函数
node * del(node * pstu)
{
node * p1 , * p2 , * head ;
int num , m ;
bool f ;
head = pstu ;
if(n > 0) {
while(n > 0) {
printf("please input stuent number(0 to terminate): ") ;
scanf("%d", & num) ;
if(num != 0) {
f = false ;
p2 = head ;
m = 0 ;
while(p2 != NULL) {
if(p2 -> num == num) {
if(! m) head = p2 -> next ;
else p1 -> next = p2 -> next ;
f = true ;
break ;
} else {
p1 = p2 ;
p2 = p1 -> next ;
}
m ++ ;
}
if(f) {
free(p2) ;
printf("成功删除学号为 %d 的学生\n" , num) ;
n -- ;
} else {
printf("抱歉,没有找到学号为 %d 的学生\n" , num) ;
}
} else {
break ;
}
}
} else {
printf("链表为空!!!\n\n") ;
}
return head ;
}
//打印函数
void print(node * pstu)
{
node * p ;
if(n > 0) {
p = pstu ;
printf("There are %d records!!!\n", n) ;
while (p != NULL) {
printf("student number = %d\n" , p -> num) ;
printf("student score= %5.2f\n\n" , p -> score) ;
p = p -> next ;
}
} else {
printf("链表为空!!!\n\n") ;
}
}
int main(void)
{
node * stu ;
char c ;
stu = insert(NULL) ;
for(;;) {
printf("\n") ;
printf("**********************************************\n") ;
printf("* 学生成绩信息管理系统 *\n") ;
printf("**********************************************\n") ;
printf(" 1. 添加学生成绩信息.\n") ;
printf(" 2. 删除学生成绩信息.\n") ;
printf(" 3. 显示学生成绩信息.\n") ;
printf(" 0. 退出学生成绩信息系统.\n") ;
printf("----------------------------------------------\n") ;
printf(" 请选择(0 - 4): ") ;
c = getch() ;
printf("\n\n") ;
if((c > 0x2f && c < 0x34) || c == 0x03 || c == 0x0d) {
if(c == 0x03 || c == 0x30) {
break ;
} else {
switch(c) {
case 0x0d:
case 0x31:
stu = insert(stu) ;
break ;
case 0x32:
stu = del(stu) ;
break ;
case 0x33:
print(stu) ;
break ;
}
}
}
}
system("pause") ;
}
谢谢,指正。才开始学习,以后注意写代码习惯。我发现了我循环插入时没有重新开辟空间导致死循环。
页:
[1]