小陈的开学第十四周代码

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值