本帖最后由 jackz007 于 2024-10-27 22:39 编辑 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct student
{
char name[256] ; // 关注这里
unsigned long long id ;
struct student * next ;
} STUDENT ;
void scan(STUDENT * book)
{
printf("输入书名 : ") ;
scanf("%s" , & book -> name) ; // 关注这里
printf("输入书号 : ") ;
scanf("%llu" , & book -> id) ;
}
void addbook(STUDENT ** libr) // 关注这里
{
STUDENT * p , * r ;
for(p = r = * libr ; p ; r = p , p = r -> next) ;
STUDENT * book = (STUDENT *) malloc(sizeof(STUDENT)) ;
scan(book) ;
book -> next = NULL ;
if(r) r -> next = book ; // 如果 libr 的值不是 NULL,那就续链
else * libr = book ; // 否则,book 就是链表的头结点
}
void pri(STUDENT * libr)
{
STUDENT * p ;
for(p = libr ; p ; p = p -> next) {
printf("%s\n" , p -> name) ;
printf("%llu\n\n" , p -> id) ;
}
}
void fre(STUDENT * libr)
{
STUDENT * p , * r ;
for(p = libr ; p ; p = r) {
r = p -> next ;
free(p) ;
}
}
int main()
{
char u ;
STUDENT * lib = NULL ;
while(1)
{
printf("是否要输入书本 : ") ;
while((u = getchar()) == '\n') ; // 关注这里
if(u == 'y') // 关注这里
{
addbook(& lib) ; // 关注这里
}
else
{
break ;
}
}
printf("是否要打印书本 : ") ;
while((u = getchar()) == '\n') ; // 关注这里
if(u == 'y') // 关注这里
{
pri(lib) ;
}
fre(lib) ;
return 0 ;
}
编译、运行实况:D:\[exercise]\C>g++ -o x x.c
D:\[exercise]\C>x
是否要输入书本 : y
输入书名 : 射雕英雄传
输入书号 : 100000001
是否要输入书本 : y
输入书名 : 江湖奇侠传
输入书号 : 100000002
是否要输入书本 : y
输入书名 : 神雕侠侣
输入书号 : 100000003
是否要输入书本 : n
是否要打印书本 : y
射雕英雄传
100000001
江湖奇侠传
100000002
神雕侠侣
100000003
D:\[exercise]\C>
【关于函数声明】,在同一个源代码文件内,一个函数,只要满足先定义(定义位于调用位置之前),再调用(调用位于函数定义之后),那就不比对这个函数进行声明。
在本例中,所有的函数均能够满足上述条件,所以,删除所有的函数声明。 |