首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

程序有些小疑点,请高手改正。这程序是谭老师书上的

2013-07-04 
程序有些小问题,请高手改正。这程序是谭老师书上的。#includestdio.h#include malloc.h#define NULL 0#d

程序有些小问题,请高手改正。这程序是谭老师书上的。


#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;
}

热点排行