6-1链式表的按序号查找(10分)
本题要求实现一个函数,找到并返回链式表的第K个元素。
函数接口定义:
ElementTypeFindKth(ListL,intK);
typedefstructLNode*PtrToLNode;structLNode{ElementTypeData;PtrToLNodeNext;};typedefPtrToLNodeList;
裁判测试程序样例:#include
#include
#defineERROR-1
typedefintElementType;
typedefstructLNode*PtrToLNode;
structLNode{
ElementTypeData;
PtrToLNodeNext;
};
typedefPtrToLNodeList;
ListRead();/*细节在此不表*/
ElementTypeFindKth(ListL,intK);
intmain()
{
intN,K;
ElementTypeX;
ListL=Read();
scanf("%d",N);
while(N--){
scanf("%d",K);
X=FindKth(L,K);
if(X!=ERROR)
printf("%d",X);
else
printf("NA");
}
return0;
}
/*你的代码将被嵌在这里*/输入样例:
-1
6
输出样例:
4NA
ElementTypeFindKth(ListL,intK)
{
inti=1;
if(L==NULL
K1)
{
returnERROR;
}while(iK(L-Next!=NULL))
{
i++;
L=L-Next;
}
if(i==K)
{
returnL-Data;
}
else
{
returnERROR;
}
}
6-2求单链表结点的阶乘和(15分)
本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。
函数接口定义:
intFactorialSum(ListL);
其中单链表List的定义如下:
typedefstructNode*PtrToNode;
structNode{
intData;/*存储结点数据*/
PtrToNodeNext;/*指向下一个结点的指针*/
};
typedefPtrToNodeList;/*定义单链表类型*/
裁判测试程序样例:
#include
#include
typedefstructNode*PtrToNode;
structNode{
intData;/*存储结点数据*/
PtrToNodeNext;/*指向下一个结点的指针*/
};
typedefPtrToNodeList;/*定义单链表类型*/
intFactorialSum(ListL);
intmain()
{
intN,i;
ListL,p;
scanf("%d",N);
L=NULL;
for(i=0;iN;i++){
p=(List)malloc(sizeof(structNode));
scanf("%d",p-Data);
p-Next=L;L=p;
}
printf("%d\n",FactorialSum(L));
return0;
}
/*你的代码将被嵌在这里*/
输入样例:
3
输出样例:
intFactorialSum(ListL)
{
intsum=0;
while(L!=NULL)
{
intjc=1;
for(inti=L-Data;i0;i--)
{
jc*=i;
}
sum+=jc;
L=L-Next;
}returnsum;
}
6-3建立学生信息链表(20分)
本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。
函数接口定义:
voidinput();
该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:
structstud_node{
intnum;/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
structstud_node*next;/*指向下个结点的指针*/
};
单向链表的头尾指针保存在全局变量head和tail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。
裁判测试程序样例:
#include
#include
#include
structstud_node{
intnum;
charname[20];
intscore;
structstud_node*next;
};
structstud_node*head,*tail;
voidinput();
intmain()
{
structstud_node*p;
head=tail=NULL;
input();
for(p=head;p!=NULL;p=p-next)
printf("%d%s%d\n",p-num,p-name,p-score);
return0;
}
/*你的代码将被嵌在这里*/
输入样例:
1zhang78
2wang80
3li75
4zhao85
0
输出样例:
1zhang78
2wang80
3li75
4zhao85
voidinput()
{
structstud_node*d;
while(1)
{
d=(structstud_node*)malloc(sizeof(structstud_node));
intnum;
scanf("%d",num);
if(num==0)
{
break;
}
else
{
d-num=num;
scanf("%s%d\n",d-name,d-score);
d-next=NULL;
if(head==NULL)
{
head=d;
}
else
{
tail-next=d;
}
tail=d;
scanf("%d",num);
}
}
}
6-4学生成绩链表处理(20分)
本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。
函数接口定义:
structstud_node*createlist();
structstud_node*deletelist(structstud_node*head,intmin_score);
函数createlist利用scanf从输入中获取学生的信息,将其组织成单向链表,并返回链表头指针。链表节点结构定义如下:
structstud_node{
intnum;/*学号*/
charname[20];/*姓名*/
intscore;/*成绩*/
structstud_node*next;/*指向下个结点的指针*/
};
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。
函数deletelist从以head为头指针的链表中删除成绩低于min_score的学生,并返回结果链表的头指针。
裁判测试程序样例:
#include
#include
structstud_node{
intnum;
charname[20];
intscore;
structstud_node*next;
};
structstud_node*createlist();
structstud_node*deletelist(structstud_node*head,intmin_score);
intmain()
{
intmin_score;
structstud_node*p,*head=NULL;
head=createlist();
scanf("%d",min_score);
head=deletelist(head,min_score);
for(p=head;p!=NULL;p=p-next)
printf("%d%s%d\n",p-num,p-name,p-score);
return0;
}
/*你的代码将被嵌在这里*/
输入样例:
1zhang78
2wang80
3li75
4zhao85
0
80
输出样例:
2wang80
4zhao85
structstud_node*createlist()
{
structstud_node*head,*tail,*q;
head=tail=NULL;
intnum;
scanf("%d",num);
while(num!=0)
{
q=(structstud_node*)malloc(sizeof(structstud_node));
scanf("%s%d",q-name,q-score);
q-num=num;
q-next=NULL;
if(head==NULL)
head=q;
else
tail-next=q;
tail=q;
scanf("%d",num);
}
returnhead;
}
structstud_node*deletelist(structstud_node*head,intmin_score)
{
structstud_node*ptr=NULL,*ptr1=NULL;
if(head==NULL)returnNULL;
ptr=head;
while(ptr!=NULL)
{
if(ptr-scoremin_score)
{
if(ptr==head)
{
head=head-next;
}
else
{
ptr1-next=ptr-next;
free(ptr);
}
}
else
{
ptr1=ptr;
}
ptr=ptr-next;
}
returnhead;
}6-5删除单链表偶数节点(20分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
structListNode{
intdata;
structListNode*next;
};
函数接口定义:
structListNode*createlist();
structListNode*deleteeven(structListNode*head);
函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到?1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。
裁判测试程序样例:
#include
#include
structListNode{
intdata;
structListNode*next;
};
structListNode*createlist();
structListNode*deleteeven(structListNode*head);
voidprintlist(structListNode*head)
{
structListNode*p=head;
while(p){
printf("%d",p-data);
p=p-next;
}
printf("\n");
}
intmain()
{
structListNode*head;
head=createlist();
head=deleteeven(head);
printlist(head);
return0;
}
/*你的代码将被嵌在这里*/
输入样例:
-1
输出样例:
structListNode*createlist()
{
structListNode*head,*tail,*q;
head=tail=NULL;
intnum;
scanf("%d",num);
while(num!=-1)
{
q=(structListNode*)malloc(sizeof(structListNode));
q-data=num;
q-next=NULL;
if(head==NULL)
head=q;
else
tail-next=q;
tail=q;
scanf("%d",num);
}
returnhead;
}
structListNode*deleteeven(structListNode*head)
{
structListNode*ptr=NULL,*ptr1=NULL;
if(head==NULL)returnNULL;
ptr=head;
while(ptr!=NULL)
{
if(ptr-data%2==0)
{
if(ptr==head)
{
head=head-next;
}
else
{
ptr1-next=ptr-next;
free(ptr);
}
}
else
{
ptr1=ptr;
}
ptr=ptr-next;
}
returnhead;
}
预览时标签不可点收录于话题#个上一篇下一篇