铜仁市论坛

首页 » 分类 » 定义 » PTA数据结构例题
TUhjnbcbe - 2020/12/16 16:23:00
北京医治白癜风医院 https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E4%B8%AD%E7%A7%91%E7%99%BD%E7%99%9C%E9%A3%8E%E5%8C%BB%E9%99%A2/9728824?fr=aladdin

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;

}

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: PTA数据结构例题