链表
线性表
主要内容
开发一个图书管理系统,基本信息包括图书的书名,作者,ISBN号。
基本实现:
输出,输入,删除,查询,插入的基本功能。
#include
#include
#include
#include
#define maxsize 10000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct booknode{
char name[50];
char writer[20];
int number;
}Book;
typedef struct sqnode{
Book date;
struct sqnode *next;
}linklist;
linklist *L;
int n;//保存图书的本数
linklist* Initlist(linklist *L){
L=(linklist *)malloc(sizeof(linklist));
L->next=NULL;
return L;
}
//输入
//尾插法建立链表
void InputNumber(linklist *L){
linklist *p,*r;
r=L;
printf("请输入链表中元素的个数:");
scanf("%d",&n);
int i;
printf("请输入%d个元素:",n);
for(i=0;i<n;i++){
p=(linklist *)malloc(sizeof(linklist));
scanf("%s%s%d",p->date.name,p->date.writer,&p->date.number);
p->next=r->next;
r->next=p;
r=p;
}
}
//头插法建立链表
/*
void InputNumber(linklist *L){
linklist *p,*r;
r=L;
printf("请输入链表中元素的个数:");
scanf("%d",&n);
int i;
printf("请输入%d个元素:",n);
for(i=0;idate.name,p->date.writer,&p->date.number);
p->next=r->next;
r->next=p;
r=p;
}
}
*/
//输出
void outputlist(linklist *L){
linklist *p;
p=L->next;
printf("\t书名\t作者\t书号\n");
while(p!=NULL){
printf("\t%s\t%s\t%d\n",p->date.name,p->date.writer,p->date.number);
p=p->next;
}
printf("\n");
}
//查找
void searchforname(linklist *L,char *name){ //按书名查询
int i;
linklist *p;
p=L->next;
for(i=0;i<n;i++){
if(strcmp(p->date.name,name )==0)
break;
}
if(i<n){
printf("你要查找的书名为%s的书号是:%d,作者是:%s\n",name,p->date.number,p->date.writer);
p=p->next;}
else
printf("所查找的书籍不在列表内!\n");
}
void searchforwriter(linklist *L,char *writer){ //按作者查询
int i;
linklist *p;
p=L->next;
for(i=0;i<n;i++){
if(strcmp(p->date.writer,writer)==0)
break;
}
if(i<n){
printf("你要查找的作者为%s的书号是:%d,书名是:%s\n",writer,p->date.number,p->date.name);
p=p->next;}
else
printf("所查找的书籍不在列表内!");
}
void searchfornumber(linklist *L,int number){
int i;
linklist *p;
p=L->next;
for(i=0;i<n;i++){
if((p->date.number)==number)
break;
}
if(i<n){
printf("你要查找的书号为%d的作者是:%s,书名是:%s\n",p->date.number,p->date.writer,p->date.name);
p=p->next;}
else
printf("所查找的书籍不在列表内!");
}
void searchlist(linklist *L){
int choice;
char name[20];
char writer[50];
int number;
while(1){
printf("********现在开始查找*********\n");
printf(" 1.按书名查找.\n") ;
printf(" 2.按作者查找.\n") ;
printf(" 3.按书号查找.\n") ;
printf(" 0.退出\n") ;
printf("请输入你的选择:");
scanf("%d",&choice);
if(choice==0)break;
switch(choice){
case 1:printf("请输入你要查找的书名:");scanf("%s",&name);
searchforname(L,name);break;
case 2:printf("请输入你要查找的作者:");scanf("%s",&writer);
searchforwriter(L,writer);break;
case 3:printf("请输入你要查找的书号:");scanf("%d",&number);
searchfornumber(L,number);break;
}
}
}
//插入
void Insertlist(linklist *L,int i,Book e){ //在带头结点的单链线性表L中的第i个位置前插入元素e
linklist *p,*s;
int j;
p=L;j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL){
printf("Error!\n");
return;
}
s=(linklist *)malloc(sizeof(linklist)); //生成新节点
s->date=e;s->next=p->next; //插入L中
p->next=s;
}
//删除
void Deltelist(linklist *L,int i,Book e){ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
linklist *p,*q;
int j;
p=L;j=0;
while(p->next&&j<i-1){ //寻找第i个结点,并令p指向前趋
p=p->next;++j;
}
if(!(p->next)||j>i-1){
printf("Error!\n");
return;
}
q=(linklist *)malloc(sizeof(linklist));
q=p->next;p->next=q->next; //删除并释放结点
e=q->date;free(q);
}
int main(int argc, char *argv[]) {
int choice;
Book e;
int i;
while(1){
printf("******图书管理信息系统*********\n");
printf(" 1.初始化.\n");
printf(" 2.图书信息输入.\n");
printf(" 3.图书信息输出.\n");
printf(" 4.图书信息的查询.\n");
printf(" 5.图书信息的插入.\n");
printf(" 6.图书信息的删除.\n");
printf(" 0.退出.\n");
printf("请输入你的选择:");
scanf("%d",&choice);
if(choice==0)break;
else{
switch(choice){
case 1:L=Initlist(L);break;
case 2:InputNumber(L);break;
case 3:outputlist(L);break;
case 4:printf("********现在开始查找*******\n");
searchlist(L);break;
case 5:printf("********现在开始插入*******\n");
printf("请输入插入图书的信息:");scanf("%s%s%d",e.name,e.writer,&e.number);
printf("请输入插入的位置:");scanf("%d",&i);
Insertlist(L,i,e);break;
case 6:printf("********现在开始删除*******\n");
printf("请输入删除的位置:");scanf("%d",&i);
Deltelist(L,i,e);break;
}
}
}
return 0;
}
``
#include
#include
#include
#define max 100
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct booknode{
char name[50];
char writer[20];
int number;
}Book;
typedef struct listnode{
Book *elem;
int length;
}seqlist;
seqlist L;
//初始化
void Inistlist(seqlist *L){
L->elem=(Book *)malloc(max*sizeof(Book));
L->length=0;
}
//输入
void Inputelem(seqlist *L){
int i;
printf("请输入书的数目:");
scanf("%d",&L->length);
for(i=0;i<L->length;i++){
scanf("%s%s%d",L->elem[i].name,L->elem[i].writer,&L->elem[i].number);
}
}
//输出
void Outputelem(seqlist *L){
int i;
printf("\t书名\t作者\t书号\n");
for(i=0;i<L->length;i++)
printf("\t%s\t%s\t%d\n",L->elem[i].name,L->elem[i].writer,L->elem[i].number);
}
//查找书名
void searchforname(seqlist *L,char *name){
int i;
for(i=0;i<L->length;i++){
if(strcmp(L->elem[i].name,name)==0)
break;
}
if(i<L->length)
printf("查找的书名是%s的书号是:%d,作者是:%s\n",name,L->elem[i].number,L->elem[i].writer);
else
printf("查无此书");
}
//查找作者
void searchforwriter(seqlist *L,char *writer){
int i;
for(i=0;i<L->length;i++){
if(strcmp(L->elem[i].writer,writer)==0)
break;
}
if(i<L->length)
printf("查找的作者是%s的书名是:%s,书号是:%d\n",writer,L->elem[i].name,L->elem[i].number );
else
printf("查无此书");
}
//查找书号
void searchfornumber(seqlist *L,int number){
int i;
for(i=0;i<L->length;i++){
if(L->elem[i].number==number)
break;
}
if(i<L->length)
printf("查找的书号是%d的书名是:%s,作者是:%s\n",number,L->elem[i].name,L->elem[i].writer);
else
printf("查无此书");
}
//查找位置
void searchforloc(seqlist *L,int i){
printf("第%d位置上的书是:%s,%s,%d\n",i,L->elem[i-1].name,L->elem[i-1].writer,L->elem[i-1].number);
}
//查找
void searchlist(seqlist *L){
int choice,i,number;
char name[20];
char writer[20];
while(1){
printf("*****查找方式*****\n");
printf(" 1.按书名查找\n");
printf(" 2.按作者查找\n");
printf(" 3.按书号查找\n");
printf(" 4.按位置查找\n");
printf(" 0.退出\n");
printf("输入查找方式:");
scanf("%d",&choice);
if(choice==0)
break;
switch(choice){
case 1:printf("输入书名:");scanf("%s",name);
searchforname(L,name);break;
case 2:printf("输入查找的作者:");scanf("%s",writer);
searchforwriter(L,writer);break;
case 3:printf("输入查找的书号: ");scanf("%d",&number);
searchfornumber(L,number);break;
case 4:printf("输入查找的位置:");scanf("%d",&i);
searchforloc(L,i);break;
}
}
}
//插入
int insertlist(seqlist *L){
int i;
i=L->length;
L->length=L->length+1;
printf("插入书的书名,作者,书号: ");
scanf("%s%s%d",L->elem[i].name,L->elem[i].writer,&L->elem[i].number);
return L->length;
}
//根据书名删除
int delforname(seqlist *L,char name[20]){
int i;
L->length=L->length-1;
for(i=0;i<L->length;i++){
if(strcmp(L->elem[i].name,name)==0)
for(;i<L->length;i++){
L->elem[i]=L->elem[i+1];
}
break;
}
return L->length;
}
//根据作者删除
int delforwriter(seqlist *L,char writer[20]){
int i;
L->length=L->length-1;
for(i=0;i<L->length;i++){
if(strcmp(L->elem[i].writer,writer)==0)
for(;i<L->length;i++){
L->elem[i]=L->elem[i+1];
}
break;
}
return L->length;
}
//根据书号删除
int delfornumber(seqlist *L,int number){
int i;
L->length=L->length-1;
for(i=0;i<L->length;i++){
if(L->elem[i].number==number)
for(;i<L->length;i++){
L->elem[i]=L->elem[i+1];
}
break;
}
return L->length;
}
//根据位置删除
int delforloc(seqlist *L,int i){
int j;
L->length=L->length-1;
for(j=0;j<L->length;j++){
if(i==1){
for(j=0;j<L->length;j++)
L->elem[j]=L->elem[j+1];
}
if(j!=i-1)continue;
else L->elem[j]=L->elem[j+1];
}
return L->length;
}
//删除
void del(seqlist *L){
int choice,i,number;
char name[20];
char writer[20];
while(1){
printf("*****删除方式*****\n");
printf(" 1.按书名删除\n");
printf(" 2.按作者删除\n");
printf(" 3.按书号删除\n");
printf(" 4.按位置删除\n");
printf(" 0.退出\n");
printf("输入删除方式:");
scanf("%d",&choice);
if(choice==0)
break;
switch(choice){
case 1:printf("输入书名:");scanf("%s",name);
delforname(L,name);break;
case 2:printf("输入作者:");scanf("%s",writer);
delforwriter(L,writer);break;
case 3:printf("输入书号: ");scanf("%d",&number);
delfornumber(L,number);break;
case 4:printf("输入位置:");scanf("%d",&i);
delforloc(L,i);break;
}
}
}
int main(int argc, char *argv[]){
int choice;
char name[20];
while(1){
printf("*****图书管理系统*****\n");
printf(" 1.初始化。\n");
printf(" 2.图书信息输入。\n");
printf(" 3.图书信息输出。\n");
printf(" 4.图书信息查找。\n");
printf(" 5.图书信息插入。\n");
printf(" 6.图书信息删除。\n");
printf(" 0.退出。\n");
printf("请输入选项:");
scanf("%d",&choice);
if(choice==0) break;
else{
switch(choice){
case 1:Inistlist(&L);break;//初始化
case 2:Inputelem(&L);break;//输入
case 3:Outputelem(&L);break;//输出
case 4:searchlist(&L);break;//查找
case 5:insertlist(&L);break;//插入
case 6:del(&L);break;//删除
}
}
}
return 0;
}