求解惑,关于long和unsigned long。。。
今天早上看见有人求图书馆管理程序的,就动手帮写了下,编译顺利通过了,可是却不能正常输出,没办法,排错弄了一白天,最后发现是数据类型的问题,代码如下
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Book{
unsigned long num; //就是这里出问题了,匪夷所思啊
char name[30];
char author[30];
struct Book *next;
}book; // 定义结构体
book * make(book *head){
book *p,*q; //制作链表节点函数
p=(book *)malloc(sizeof(book));
printf("enter num:");
fflush(stdin);
scanf("%d",&p->num);
fflush(stdin);
printf("enter name:");
gets(p->name);
printf("enter author:");
gets(p->author);
p->next=NULL;
if(head==NULL){head=p;return head;}//如果链表是第一次建立,即链表原来无内容
else {q=head;
while(q->next)q=q->next;//链表原来有内容
q->next=p;return head;} }
book * find(book *head,char *s){//查找函数
book *p;
p=head;
while(p){
if(!(strcmp(s,p->name)))return p;//将字符串与链表内容比对,如一样,返回该节点指针
p=p->next; }
return NULL;//如比对结果都不一样,返回空指针
}
book * del(book *head,book *p){//删除节点函数
book *q;
q=head;
if(p==head){
q=head;head=head->next;//如果删除的是头节点,返回新的头指针
free(q);return head;}
while(q->next!=p){q=q->next;continue;}//将q指向p的前一个节点
q->next=p->next;
free(p);return head;}
book * mod(book *head,book *p){//修改节点函数
while(head==p)continue;
printf("enter num");
scanf("%d",&p->num);
printf("enter name");
scanf("%s",p->name);
printf("enter author");
scanf("%s",p->author);
return head;}
void xianshi(book *p){//显示全部函数
while(p){
printf("No.:%d\nname:%s\nauthor:%s\n\n",p->num,p->name,p->author);
p=p->next;}}
main(){
int x,i,j;
book *head=NULL,*p;
char s1[30];
for(;;){
printf("=============enter what=================\n");
printf("\t1:enter book.\n\t2:search book.\n\t3:delete book.\n\t4:modify book.\n\t5:xianshi\n");
printf("========================================\n");
fflush(stdin);
scanf("%d",&x);
switch(x){
case 1:head=make(head);break;//建立节点
case 2:
case 3:
case 4:if(head==NULL){printf("no have any book!\n");break;}
printf("whitch book");fflush(stdin);
scanf("%s",s1);p=find(head,s1);
if(x==2)if(p)printf("NO.:%d\nname:%s\nautor:%s\n",p->num,p->name,p->author);
else printf("no find");
if(x==3)head=del(head,p);
if(x==4)head=mod(head,p);
break;
case 5:xianshi(head);break;
default:printf("error");
}
printf("===========还有事吗?=============");
printf("\n\t1:有. 0:没有\n========================================\n");
fflush(stdin);
scanf("%d",&x);
if(!x)break;
}
}
原来我想书要是很多的话,int型不够就用的unsigned long,测试时也用的长整数(7,8位都),这样就发现输出的编号都不是我输入的数字。起初根本没想到类型的问题,到后来才发现不论我定义int还是unsigned long都只能输入5位数,可是我翻遍数都是unsigned有效位是十位啊,为什么我输入6位就不行了呢??求解惑??











