1. 带头结点链栈的操作
题意:
本题要求实现带头链表的栈,写出Push 、Pop函数。
裁判测试程序样例:
#include <malloc.h>
#include <stdio.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode * next;
}LNode,*LinkList;
Status InitList(LinkList *L);
Status List(LinkList L);
Status ListInsert(LinkList L,int i,ElemType e);
int main()
{
LinkList L;
int x;
InitList(&L);
Push(L,1);Push(L,2);Push(L,3);
List(L);
Pop(L,&x);
printf(" %d\n",x);
List(L);
return 0;
}
/* 请在这里填写答案 */
其中 L 和 e 都是用户传入的参数。 L 是带头结点的头指针; e 是数据元素。
样例输出:
3 2 1
3
2 1
解题思路:
这道题我写了好久,一直都是段错误,后来发现我的Pop函数中的e没有加*,可是为什么要加号呢,我不是很明白,但是加了号就对了。
程序代码:
Status Push(LinkList L,ElemType e){
LinkList s;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
}
Status Pop(LinkList L,ElemType *e){
LinkList p=L->next;
if(p==NULL)
return ERROR;
*e=p->data;
L->next=p->next;
}
2.邻接矩阵存储图的深度优先遍历
题意:
试实现邻接矩阵存储图的深度优先遍历。
裁判测试程序样例:
#include <stdio.h>
typedef enum {false, true} bool;
#define MaxVertexNum 10 /* 最大顶点数设为10 */
#define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void Visit( Vertex V )
{
printf(" %d", V);
}
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
int main()
{
MGraph G;
Vertex V;
G = CreateGraph();
scanf("%d", &V);
printf("DFS from %d:", V);
DFS(G, V, Visit);
return 0;
}
/* 你的代码将被嵌在这里 */
函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。
样例输入:
5
样例输出:
DFS from 5: 5 1 3 0 2 4 6
程序代码:
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ){
int i;
Visited[V]=true;
Visit(V);
for(i=0;i<Graph->Nv;i++){
if(Visited[i]==0&&Graph->G[V][i]==1)
DFS(Graph,i,Visit);
}
}
3.有序数组的插入
题意:
本题要求将任一给定元素插入从大到小排好序的数组中合适的位置,以保持结果依然有序。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef enum {false, true} bool;
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List ReadInput(); /* 裁判实现,细节不表。元素从下标0开始存储 */
void PrintList( List L ); /* 裁判实现,细节不表 */
bool Insert( List L, ElementType X );
int main()
{
List L;
ElementType X;
L = ReadInput();
scanf("%d", &X);
if ( Insert( L, X ) == false )
printf("Insertion failed.\n");
PrintList( L );
return 0;
}
/* 你的代码将被嵌在这里 */
L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较,并且题目保证传入的数据是递减有序的。函数Insert要将X插入Data[]中合适的位置,以保持结果依然有序(注意:元素从下标0开始存储)。但如果X已经在Data[]中了,就不要插入,返回失败的标记false;如果插入成功,则返回true。另外,因为Data[]中最多只能存MAXSIZE个元素,所以如果插入新元素之前已经满了,也不要插入,而是返回失败的标记false。
样例输入:
5
35 12 8 7 3
10
样例输出:
35 12 10 8 7 3
Last = 5
程序代码:
bool Insert( List L, ElementType X ){
int i;
if((L->Last)==(MAXSIZE-1))
return false;
for(i=0;i<=L->Last;i++){
if(X==L->Data[i])
return false;
if(X>(L->Data[i])){
int j;
for(j=(L->Last);j>=i;j--){
L->Data[j+1]=L->Data[j];
}
L->Data[i]=X;
(L->Last)++;
return true;
}
}
L->Data[i]=X;
L->Last++;
return true;
}
4.线性表元素的区间删除
题意:
给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
裁判测试程序样例:
#include <stdio.h>
#define MAXSIZE 20
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};
List ReadInput(); /* 裁判实现,细节不表。元素从下标0开始存储 */
void PrintList( List L ); /* 裁判实现,细节不表 */
List Delete( List L, ElementType minD, ElementType maxD );
int main()
{
List L;
ElementType minD, maxD;
int i;
L = ReadInput();
scanf("%d %d", &minD, &maxD);
L = Delete( L, minD, maxD );
PrintList( L );
return 0;
}
/* 你的代码将被嵌在这里 */
L是用户传入的一个线性表,其中ElementType元素可以通过>、==、<进行比较;minD和maxD分别为待删除元素的值域的下、上界。函数Delete应将Data[]中所有值大于minD而且小于maxD的元素删除,同时保证表中剩余元素保持顺序存储,并且相对位置不变,最后返回删除后的表。
样例输入:
10
4 -8 2 12 1 5 9 3 3 10
0 4
样例输出:
4 -8 12 5 9 10
程序代码:
List Delete( List L, ElementType minD, ElementType maxD ){
int i;
int INF=0x3f3f3f3f;
for(i=0;i<=L->Last;i++){
if((L->Data[i])>minD && (L->Data[i])<maxD){
L->Data[i]=INF;
}
}
int cnt=0;
for(i=0;i<=L->Last;i++){
if(L->Data[i]!=INF){
L->Data[cnt++]=L->Data[i];
}
}
L->Last=cnt-1;
return L;
}
5.字符串的冒泡排序
题意:
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
输入:
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出:
输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
样例输入:
6 2
best
cat
east
a
free
day
样例输出:
best
a
cat
day
east
free
程序代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
string a[100+10];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=k;i++){
for(int j=1;j<n;j++){
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<endl;
return 0;
}