1、设有图书馆中每个图书的信息包括编号(num)、书名(name)、作者(author)和馆存量(stock)四项信息。假定所有图书信息已经按编号升序采用顺序存储方式存储在一个一维数组中下标从0开始的各个数组元素中。要求:
(1)写出用于存储图书信息所需的结构体类型定义;
(2)编写两个函数,分别完成以下功能:
① 实现按图书编号进行查找的功能:即给定一个编号,查找编号等于指定编号的图书。若查找成功则返回该图书所在数组元素的下标,若查找不成功则返回-1;(函数名为search)
②实现显示库存图书的功能:即将所有图书的4项信息显示在屏幕上。(函数名为output)
参考答案一
typedef struct booktype
{ long int num; /*图书编号*/
char name[20]; /*图书名称*/
char author[20]; /*图书作者*/
int stock; /*图书馆存量*/
}BOOK;
int search(BOOK b[],int n,long int tnum)
{int i;
i=n-1;
while(b[i].num>tnum&&i>=0)
i--;
if(b[i].num==tnum)
return(i);
else
return(-1);
}
void output(BOOK b[],int n)
{int i;
printf(" 编号 名称 作者 馆存量\n");
for(i=0;i<n;i++)
printf("%6ld%20s%20s%6d\n",b[i].num,b[i].name,b[i].author,b[i]stock);
}
参考答案二
(1)
typedef struct booktype
{ long int num; /*图书编号*/
char name[20]; /*图书名称*/
char author[20]; /*图书作者*/
int stock; /*图书馆存量*/
}ElemType;
typedef struct
{ ElemType list[MAXLEN];
int length;
}SeqList;
(2)
①
int SearchList(SeqList* L,long tnum)
{int i;
i=L->length-1;
while(L->list[i].num!=tnum&&i>=0)
i--;
return(i);
}
②
void output(SeqList* L)
{int i;
printf(" 编号 名称 作者 馆存量\n");
for(i=0;i<L->length;i++)
printf("%6ld%20s%20s%6d\n",L->list[i].num,L->list[i].name,L->list
[i].author,L->list[i].stock);
}
2、设有一个非空整型线性表采用带头结点的单链表进行存储,单链表的头指针为head,结点的数据域名为data,指针域名为next,结点类型如下:
typedef struct nodetype
{int data;
struct nodetype *next;
}NODE ;
现在要求编写函数实现:删除单链表中的最后一个结点,并将删除结点的数据值返回给主调函数。删除函数的原型为int delete(NODE *head)。
int delete(NODE *head)
{
int y;
NODE * p,* q;
p=head->next;
q=head;
if (p==NULL)
{printf(“链表为空”);
exit(1);
else
{
while(p->next!=NULL)
{ q=p;
p=p->next;
}
q->next=NULL;
y=p->data;
free(p);
return(y);
}
}
3、有一个房产信息管理系统,实现如下部分功能(要求用顺序表存储):
(1)房产信息包含:门牌号、户主、电话号码、面积。定义房产信息的结构体数据结构,名称为house,并将该类型定义为elemtype类型。
(2) 编写一个初始化函数(函数名为input):从键盘读入房产基本信息。
(3)编写一个可以查询出任何一个住户应缴纳取暖费用的函数float cost(elemtype a[],int n,int k)。其中n是住户数量,数组a中存放房产基本信息,k是要查询的门牌号(当有对应的门牌号,返回应缴纳取暖费,否则返后0,并且给出提示信息)计算公式为:每户应缴纳费用=面积*x元/m2。。
(4)编写主函数,通过菜单循环调用以上两个函数。
typedef struct house
{
int num;
char name[20];
char telephone[20];
float area;
}elemtype;
void input(elemtype a[],int n)
{
int i;
printf(“请输入房产基本信息”);
for(i=0;i<n;i++)
{
scanf(“%d”,&a[i].num);
scanf(“%s”,a[i].name);
scanf(“%s”,a[i].telephone);
scanf(“%s”,&a[i].area);
}
}
float cost(int a[],int n,int k)
{
int i;
for(i=0;i<n;i++)
if(a[i].num==k)
return (x*a[i],area);
else
{
printf(“无此门牌号”);
return 0;
}
}
#include<stdio.h>
#define MAXLEN 1000
typedef struct house
{
int num;
char name[20];
char telephone[20];
float area;
}elemtype;
void input(elemtype a[],int n);
float cost(int a[],int n,int k);
void main()
{ elemtype f[MAXLEN];
int ch,n,k;
float y;
ch=6;
while(ch!=0)
{ printf("*****************************\n");
printf("* 1-----------输入基本信息 *\n");
printf("* 2------------查询取暖费用 *\n");
printf("*****************************\n");
printf("请输入你的选择:(0-2)\n");
scanf("%d",&ch);
switch (ch)
{case 1:
printf("请输入住户数量n的值 *\n");
scanf(“%d”,&n);
input(f,n);
break;
case 2:
printf("请输入要查询的门牌号k的值 *\n");
scanf(“%d”,&k);
y=cost(f,n,k);
printf("门牌号k %d住户的取暖费用为 %7.2f",k,y);
break;
} /*switch*/
} /*while*/
}
4、假设有两个递减有序带头结点的单链表A和B,其结点类型为
typedef struct node
{ int data;
struct node *next;
}LNode;
试编写一算法利用原结点空间将它们合并为一个递增有序的链表C。(12分)
#include <stdio.h>
#include <stdlib.h>
#define n1 4
#define n2 3
typedef struct node
{int data;
struct node *next;
} LNode;
void insert(LNode *head,LNode *s);
LNode *build(int a[],int n);
void combin(LNode * heada,LNode * headb);
LNode *build(int a[],int n)//创建单链表
{ LNode *head,*s,*tail;
int i;
head=( LNode *)malloc(sizeof(LNode));
head->next=NULL;
tail=head;
for(i=0;i<n;i++)
{s=( LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=NULL;
tail->next=s;
tail=s;
}
return head;
}
void combin(LNode * heada,LNode * headb)
{ LNode *p;
p=headb->next;
while(p!=NULL)
{headb->next=p->next;
p->next=NULL;
insert(heada,p);
p=headb->next;
}//将两个递减有序的单链表合并成一个递减有序的单链表,heada指向头接点。
p=heada->next;
headb->next=NULL
while(p!=NULL)
{ heada->next=p->next;
p->next=NULL;
p->next=headb->next;
headb->next=p;
}//将一个递减有序的单链表转换成一个递增有序的链表,headb指向头接点。
free(heada);
}
void insert(LNode *head,NODE *s)//将s接点插入到递增有序的链表中,单链表保持递增有序
{ LNode *p,*q;
p=head->next;
q=head;
while(p!=NULL&&s->data<p->data)
{q=p;
p=p->next;
}
q->next=s;
s->next=p;
}
void output(LNode *head)//显示单链表接点数据
{ LNode *p;
p=head->next;
while(p!=NULL)
{printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{ LNode *heada,*headb;
int a[n1]={9,7,5,1};
int b[n2]={8,6,3};
heada=build(a,n1);
output(heada);
headb=build(b,n2);
output(headb);
combin(heada,headb);
output(headb);
}
(1)写出用于存储图书信息所需的结构体类型定义;
(2)编写两个函数,分别完成以下功能:
① 实现按图书编号进行查找的功能:即给定一个编号,查找编号等于指定编号的图书。若查找成功则返回该图书所在数组元素的下标,若查找不成功则返回-1;(函数名为search)
②实现显示库存图书的功能:即将所有图书的4项信息显示在屏幕上。(函数名为output)
参考答案一
typedef struct booktype
{ long int num; /*图书编号*/
char name[20]; /*图书名称*/
char author[20]; /*图书作者*/
int stock; /*图书馆存量*/
}BOOK;
int search(BOOK b[],int n,long int tnum)
{int i;
i=n-1;
while(b[i].num>tnum&&i>=0)
i--;
if(b[i].num==tnum)
return(i);
else
return(-1);
}
void output(BOOK b[],int n)
{int i;
printf(" 编号 名称 作者 馆存量\n");
for(i=0;i<n;i++)
printf("%6ld%20s%20s%6d\n",b[i].num,b[i].name,b[i].author,b[i]stock);
}
参考答案二
(1)
typedef struct booktype
{ long int num; /*图书编号*/
char name[20]; /*图书名称*/
char author[20]; /*图书作者*/
int stock; /*图书馆存量*/
}ElemType;
typedef struct
{ ElemType list[MAXLEN];
int length;
}SeqList;
(2)
①
int SearchList(SeqList* L,long tnum)
{int i;
i=L->length-1;
while(L->list[i].num!=tnum&&i>=0)
i--;
return(i);
}
②
void output(SeqList* L)
{int i;
printf(" 编号 名称 作者 馆存量\n");
for(i=0;i<L->length;i++)
printf("%6ld%20s%20s%6d\n",L->list[i].num,L->list[i].name,L->list
[i].author,L->list[i].stock);
}
2、设有一个非空整型线性表采用带头结点的单链表进行存储,单链表的头指针为head,结点的数据域名为data,指针域名为next,结点类型如下:
typedef struct nodetype
{int data;
struct nodetype *next;
}NODE ;
现在要求编写函数实现:删除单链表中的最后一个结点,并将删除结点的数据值返回给主调函数。删除函数的原型为int delete(NODE *head)。
int delete(NODE *head)
{
int y;
NODE * p,* q;
p=head->next;
q=head;
if (p==NULL)
{printf(“链表为空”);
exit(1);
else
{
while(p->next!=NULL)
{ q=p;
p=p->next;
}
q->next=NULL;
y=p->data;
free(p);
return(y);
}
}
3、有一个房产信息管理系统,实现如下部分功能(要求用顺序表存储):
(1)房产信息包含:门牌号、户主、电话号码、面积。定义房产信息的结构体数据结构,名称为house,并将该类型定义为elemtype类型。
(2) 编写一个初始化函数(函数名为input):从键盘读入房产基本信息。
(3)编写一个可以查询出任何一个住户应缴纳取暖费用的函数float cost(elemtype a[],int n,int k)。其中n是住户数量,数组a中存放房产基本信息,k是要查询的门牌号(当有对应的门牌号,返回应缴纳取暖费,否则返后0,并且给出提示信息)计算公式为:每户应缴纳费用=面积*x元/m2。。
(4)编写主函数,通过菜单循环调用以上两个函数。
typedef struct house
{
int num;
char name[20];
char telephone[20];
float area;
}elemtype;
void input(elemtype a[],int n)
{
int i;
printf(“请输入房产基本信息”);
for(i=0;i<n;i++)
{
scanf(“%d”,&a[i].num);
scanf(“%s”,a[i].name);
scanf(“%s”,a[i].telephone);
scanf(“%s”,&a[i].area);
}
}
float cost(int a[],int n,int k)
{
int i;
for(i=0;i<n;i++)
if(a[i].num==k)
return (x*a[i],area);
else
{
printf(“无此门牌号”);
return 0;
}
}
#include<stdio.h>
#define MAXLEN 1000
typedef struct house
{
int num;
char name[20];
char telephone[20];
float area;
}elemtype;
void input(elemtype a[],int n);
float cost(int a[],int n,int k);
void main()
{ elemtype f[MAXLEN];
int ch,n,k;
float y;
ch=6;
while(ch!=0)
{ printf("*****************************\n");
printf("* 1-----------输入基本信息 *\n");
printf("* 2------------查询取暖费用 *\n");
printf("*****************************\n");
printf("请输入你的选择:(0-2)\n");
scanf("%d",&ch);
switch (ch)
{case 1:
printf("请输入住户数量n的值 *\n");
scanf(“%d”,&n);
input(f,n);
break;
case 2:
printf("请输入要查询的门牌号k的值 *\n");
scanf(“%d”,&k);
y=cost(f,n,k);
printf("门牌号k %d住户的取暖费用为 %7.2f",k,y);
break;
} /*switch*/
} /*while*/
}
4、假设有两个递减有序带头结点的单链表A和B,其结点类型为
typedef struct node
{ int data;
struct node *next;
}LNode;
试编写一算法利用原结点空间将它们合并为一个递增有序的链表C。(12分)
#include <stdio.h>
#include <stdlib.h>
#define n1 4
#define n2 3
typedef struct node
{int data;
struct node *next;
} LNode;
void insert(LNode *head,LNode *s);
LNode *build(int a[],int n);
void combin(LNode * heada,LNode * headb);
LNode *build(int a[],int n)//创建单链表
{ LNode *head,*s,*tail;
int i;
head=( LNode *)malloc(sizeof(LNode));
head->next=NULL;
tail=head;
for(i=0;i<n;i++)
{s=( LNode *)malloc(sizeof(LNode));
s->data=a[i];
s->next=NULL;
tail->next=s;
tail=s;
}
return head;
}
void combin(LNode * heada,LNode * headb)
{ LNode *p;
p=headb->next;
while(p!=NULL)
{headb->next=p->next;
p->next=NULL;
insert(heada,p);
p=headb->next;
}//将两个递减有序的单链表合并成一个递减有序的单链表,heada指向头接点。
p=heada->next;
headb->next=NULL
while(p!=NULL)
{ heada->next=p->next;
p->next=NULL;
p->next=headb->next;
headb->next=p;
}//将一个递减有序的单链表转换成一个递增有序的链表,headb指向头接点。
free(heada);
}
void insert(LNode *head,NODE *s)//将s接点插入到递增有序的链表中,单链表保持递增有序
{ LNode *p,*q;
p=head->next;
q=head;
while(p!=NULL&&s->data<p->data)
{q=p;
p=p->next;
}
q->next=s;
s->next=p;
}
void output(LNode *head)//显示单链表接点数据
{ LNode *p;
p=head->next;
while(p!=NULL)
{printf("%5d",p->data);
p=p->next;
}
printf("\n");
}
void main()
{ LNode *heada,*headb;
int a[n1]={9,7,5,1};
int b[n2]={8,6,3};
heada=build(a,n1);
output(heada);
headb=build(b,n2);
output(headb);
combin(heada,headb);
output(headb);
}