程序有些小问题,请高手改正。这程序是谭老师书上的。
#include<stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;//学号,学号不为0,若为0,输入数据结束。
float score;//分数。
struct student* next;
};
int n;
struct student* create(void)//void不要进行参数传递。
{
struct student* head;
struct student *p1, *p2;
n = 0;//n为节点个数。
p1 = p2 = (struct student*)malloc(LEN);
scanf("%ld %f", &p1->num, &p1->score);//这里为什么用&?因为这里用的是scanf。
head = NULL;
while(p1->num != 0)
{
n = n+1;
if(n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct student*)malloc(LEN);
scanf("%ld %f", &p1->num, &p2->score);
}
p2->next = NULL;
return head;
}
void print(struct student* head)
{
struct student* p;
printf("\nNow,These %d records are:\n", n);
p = head;
if(head != NULL)
{
do
{
printf("%ld %5.1f\n", p->num, p->score);
p = p->next;
}while(p != NULL);
}
}
struct student* del(struct student* head, long num)
{
struct student *p1, *p2;
if(head == NULL)
{
printf("\nlist null\n");
goto end;
}
p1 = head;
while(num != p1->num && p1->next !== NULL)//p1指向的不是所要的结点,并且后还有结点。
{
p2 = p1;
p1 = p1->next;//p1向后移一个结点。
}
if(num == p1->num)
{
if(p1 == head)
{
head = p1->next;
}
else
{
p2->next = p1->next;
}
printf("delete:%ld\n",num);
n = n-1;
}
else
{
printf("%ld not been found!\n", num);//找不到该结点。
}
end;
return head;
}
struct student* insert(struct student* head, struct student* head)
{
struct student *p0, *p1, *p2;
p1 = head;
p0 = stud;//p0是要插入的结点。
if(head == NULL)//原来的表是空表。
{
head = p0;//p0指向的结点为作为头结点。
p0->next = NULL;
}
else
{
while( (p0->num > p1->num) && (p1->next != NULL) )
{
p2 = p1;//p2指向p1指向的结点。
p1 = p1->next;//p1后移一个结点。
}
if(p0->num <= p1->num)
{
if(head == p1)//插入到第一个结点之前。
{
head = p0;
}
else
{
p2->next = p0;//搬到p2指向的结点之后。
}
p0->next = p1;
}
else
{
p1->next = p0;//插入到最后结点之后。
p0->next = NULL;
}
}
n = n+1;//结点数加1。
return head;
}
int main(void)
{
struct student* head, stu;
long del_num;
printf("input records:\n");
head = create();
print(head);
printf("\ninput the deleted number:");
scanf("%ld", &del_num);
head = del(head, del_num);
print(head);
printf("\ninput the inserted record:");
scanf("%ld, %f", &stu.num, &stu.score);
head = insert(head, &stu);
print(head);
return 0;
}
struct malloc sizeof printf
[解决办法]
end; 改为end: // 分号改为冒号,表示一个标号
insert函数形参定义有误,出现两个head,估计一个应该是stud
[解决办法]
估计是你的笔误
#include <stdio.h>
#include <malloc.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student* next;
};
int n;
struct student* create(void)
{
struct student* head;
struct student *p1, *p2;
n = 0;
p1 = p2 = (struct student*)malloc(LEN);
scanf("%ld %f", &p1->num, &p1->score);
head = NULL;
while(p1->num != 0)
{
n = n+1;
if(n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct student*)malloc(LEN);
scanf("%ld %f", &p1->num, &p2->score);
}
p2->next = NULL;
return head;
}
void print(struct student* head)
{
struct student* p;
printf("\nNow,These %d records are:\n", n);
p = head;
if(head != NULL)
{
do
{
printf("%ld %5.1f\n", p->num, p->score);
p = p->next;
}while(p != NULL);
}
}
struct student* del(struct student* head, long num)
{
struct student *p1, *p2;
if(head == NULL)
{
printf("\nlist null\n");
goto end;
}
p1 = head;
while(num != p1->num && p1->next != NULL)// 这里是!= 而不是 !==
{
p2 = p1;
p1 = p1->next;
}
if(num == p1->num)
{
if(p1 == head)
{
head = p1->next;
}
else
{
p2->next = p1->next;
}
printf("delete:%ld\n",num);
n = n-1;
}
else
{
printf("%ld not been found!\n", num);
}
end: //这里加冒号
return head;
}
struct student* insert(struct student* head, struct student* stud)//这里重定义了 改为stud
{
struct student *p0, *p1, *p2;
p1 = head;
p0 = stud;
if(head == NULL)
{
head = p0;
p0->next = NULL;
}
else
{
while( (p0->num > p1->num) && (p1->next != NULL) )
{
p2 = p1;
p1 = p1->next;
}
if(p0->num <= p1->num)
{
if(head == p1)
{
head = p0;
}
else
{
p2->next = p0;
}
p0->next = p1;
}
else
{
p1->next = p0;
p0->next = NULL;
}
}
n = n+1;
return head;
}
int main(void)
{
struct student* head, stu;
long del_num;
printf("input records:\n");
head = create();
print(head);
printf("\ninput the deleted number:");
scanf("%ld", &del_num);
head = del(head, del_num);
print(head);
printf("\ninput the inserted record:");
scanf("%ld, %f", &stu.num, &stu.score);
head = insert(head, &stu);
print(head);
return 0;
}