|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我的lib结构体指针只用了一层,可以吗,还有在输入的时候,当我把结构体内的成员改成两个字符数组时,需要输入的数量就变了,但还是有一样的输入问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
typedef struct student
{
char a;
int b;
struct student* next;
} s;
void addbook(s*libr);
void scan(s*book);
void pri(s*book);
void fre(s*book);
void scan(s*book)
{
printf("输入书名\n");
scanf("%c\n",&book->a);
printf("输入书号\n");
scanf("%d\n",&book->b);
}
void addbook(s*libr)
{
s* book=(s*)malloc(sizeof(s));
s*temp;
assert(book!=NULL);
scan(book);
if(libr==NULL)
{
libr=book;
book->next=NULL;
}else
{
temp=libr;
libr=book;
book->next=temp;
}
}
void pri(s*libr)
{
s*book;
book=libr;
while(book!=NULL)
{
printf("%c\n",book->a);
printf("%d\n",book->b);
book=book->next;
}
}
void fre(s*book)
{
s* temp;
while(book!=NULL)
{
s* temp=book;
book=book->next;
free(temp);
}
}
int main ()
{
s*lib=NULL;
int u;
while(1)
{
printf("是否要输入书本\n");
u=getchar();
if(u=='y')
{
addbook(lib);
}else
{
break;
}
}
printf("是否要打印书本\n");
scanf("%c",&u);
if(u=='y')
{
pri(lib);
}
fre(lib);
return 0;
}
本帖最后由 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>
复制代码
【关于函数声明】,在同一个源代码文件内,一个函数,只要满足先定义(定义位于调用位置之前),再调用(调用位于函数定义之后),那就不比对这个函数进行声明。
在本例中,所有的函数均能够满足上述条件,所以,删除所有的函数声明。
|
|