数据结构04

0401

实现整型数顺序表的赋值、打印、取值和查找操作
输入要求:
见代码注释
输出要求:
见代码注释
数据示例1:
输入:
5 
1 3 5 7 9
0
1 1
1 5
1 0
1 6
2 5
2 2
输出:
1 3 5 7 9 
1
9
Error
Error
3
Error
#include<stdio.h>
#include<stdlib.h> 

// 函数结果状态码 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define MAXSIZE 10	// 顺序表可能达到的最大长度 

typedef int ElemType;	// 元素数据类型 

typedef  struct {
	ElemType  *elem;     //指向数据元素的基地址
	int      length;     // 当前长度
} SqList;  // 顺序表

/*顺序表基本操作,序号i从1开始 */
// 初始化空表 
void init(SqList &L){
	L.elem = new ElemType[MAXSIZE];
	L.length = 0;
} 
// 根据用户输入,为表中前 n 个元素赋值 
void assign(SqList &L, int n);

// 遍历,打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void traverseList(SqList L);

// 取值,将序号i的元素存入e 	
Status getElem(SqList L, int i, ElemType &e);	

// 查找,返回元素e的序号 
int locateElem(SqList L, ElemType e);

int main(){
	SqList list;
	int cmd, result, e, n, i;
	scanf("%d", &n);
	init(list); 
	assign(list, n);
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			traverseList(list);
			break;
		case 1:
			scanf("%d", &i);
			result = getElem(list, i, e);
			if (result) printf("%d\n", e);
			else printf("Error\n");
			break; 
		case 2:
			scanf("%d", &e);
			result = locateElem(list, e);
			if (result) printf("%d\n", result);
			else printf("Error\n");
			break; 		
		default:
			printf("Unknow Command.\n");
			break;
		}
	}
	return 0;
} 


// 根据用户输入,为表中前 n 个元素赋值 
void assign(SqList &L, int n)
{
	for(int i=0;i<n;i++)
	{
		scanf("%d",&L.elem[i]);
	}
	L.length=n;
}
// 遍历,打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void traverseList(SqList L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
}

// 取值,将序号i的元素存入e 	
Status getElem(SqList L, int i, ElemType &e)
{
	int Error=0;
	if(i<1||i>L.length)
		return Error;
	e=L.elem[i-1];
	return e;
}	

// 查找,返回元素e的序号 
int locateElem(SqList L, ElemType e)
{
	int Error=0;
	for(int i=0;i<L.length;i++)
	{
		if(L.elem[i]==e)
			return i+1;
	}
	return Error;
}

0402

实现整型数顺序表的插入和删除操作

输入要求:
见代码注释

输出要求:
见代码注释

数据示例1:
输入:
5
2 4 6 8 0
3 3 3
4 1
0
输出:
OK
OK
4 3 6 8 0
#include<stdio.h>
#include<stdlib.h> 

// 函数结果状态码 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define MAXSIZE 10	// 顺序表可能达到的最大长度 

typedef int ElemType;	// 元素数据类型 

typedef  struct {
	ElemType  *elem;     //指向数据元素的基地址
	int      length;     // 当前长度
} SqList;  // 顺序表

/*顺序表基本操作,序号i从1开始 */
// 初始化空表 
void init(SqList &L){
	L.elem = new ElemType[MAXSIZE];
	L.length = 0;
} 
// 根据用户输入,为表中前 n 个元素赋值 
void assign(SqList &L, int n);

// 遍历,打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void traverseList(SqList L);

// 在表中的第 i 位置插入元素 e 
Status listInsert(SqList &L, int i, ElemType e);

// 删除表中的第 i 个 元素 
Status listDelete(SqList &L, int i); 


int main(){
	SqList list;
	int cmd, result, e, n, i;
	scanf("%d", &n);
	init(list); 
	assign(list, n);
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			traverseList(list);
			break;
		case 3:
			scanf("%d %d", &i, &e);
			result = listInsert(list, i, e);
			if (result) printf("OK\n");
			else printf("Error\n");
			break; 
		case 4:
			scanf("%d", &i);
			result = listDelete(list, i);
			if (result) printf("OK\n");
			else printf("Error\n");
			break; 		
		default:
			printf("Unknow Command.\n");
			break;
		}
	}
	return 0;
} 
///
// 根据用户输入,为表中前 n 个元素赋值 
void assign(SqList &L, int n)
{
	for(int i=0;i<n;i++)
	{
		scanf("%d",&L.elem[i]);
	}
	L.length=n;
}

// 遍历,打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void traverseList(SqList L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
}

// 在表中的第 i 位置插入元素 e 
Status listInsert(SqList &L, int i, ElemType e)
{
	
	if(i<1||i>L.length+1) 
		return 0;
	if(L.length==MAXSIZE)
		return 0;
	for(int j=L.length-1;j>=i-1;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i-1]=e;
	L.length++;
	return OK;
}

// 删除表中的第 i 个 元素 
Status listDelete(SqList &L, int i)
{
	if(i<1||i>L.length) 
		return 0;
	for(int j=i;j<=L.length;j++)
		L.elem[j-1]=L.elem[j];
	L.length--;
	return OK;
}

0403

删除一个非空顺序表中第一个最大的元素
输入要求:
多组输入。
每组首先输入一个整数n(0<n<=10),表示表长,然后输入n个整数
输出要求:
输出删除操作后表中元素,每个元素后面有一个空格,输出结束后换行。
数据示例1:
输入:
1 1
3 1 2 3
3 3 2 1
输出:
1 2 
2 1
#include<stdio.h>
#include<stdlib.h> 

#define MAXSIZE 10	// 顺序表可能达到的最大长度 
typedef int ElemType;	// 元素数据类型 

typedef  struct {
	ElemType  *elem;     //指向数据元素的基地址
	int      length;     // 当前长度
} SqList;  // 顺序表

// 根据用户输入,创建长度位n的顺序表 
void createList(SqList &L, int n);

// 打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void printList(SqList L);

// 删除非空顺序表中的第一个最大元素 
void deleteMax(SqList &L);

int main(){
	int n;
	while(~scanf("%d", &n)){
		SqList L;
		createList(L, n);
		deleteMax(L); 
		printList(L);
	}
	return 0;
}
///
// 根据用户输入,创建长度位n的顺序表 
void createList(SqList &L, int n)
{
	L.elem=new ElemType[MAXSIZE];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&L.elem[i]);
	}
	L.length=n;
}

// 打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void printList(SqList L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
}

// 删除非空顺序表中的第一个最大元素 
void deleteMax(SqList &L)
{
	int o,i,max=0;
	for(i=0;i<L.length;i++)
	{
		if(L.elem[i]>max)
		{
			max=L.elem[i];
			o=i;
		}
	} 
	for(int j=o;j<L.length;j++)
		L.elem[j]=L.elem[j+1];
	L.length--;
}

0404

复制非空顺序表中第一个最小元素

输入要求:
多组输入。

每组首先输入一个整数n(0<n<=9),表示表长,然后输入n个整数

输出要求:
输出复制操作后表中元素,每个元素后面有一个空格,输出结束后换行。

数据示例1:
输入:
1 1
3 1 2 3
3 3 2 1
输出:
1 1 
1 1 2 3 
3 2 1 1
#include<stdio.h>
#include<stdlib.h> 

#define MAXSIZE 10	// 顺序表可能达到的最大长度 
typedef int ElemType;	// 元素数据类型 

typedef  struct {
	ElemType  *elem;     //指向数据元素的基地址
	int      length;     // 当前长度
} SqList;  // 顺序表

// 根据用户输入,创建顺序表 
void createList(SqList &L, int n);

// 打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void printList(SqList L);

// 复制非空顺序表中第一个的最小的元素 
void duplicateMin(SqList &L);

int main(){
	int n;
	while(~scanf("%d", &n)){
		SqList L;
		createList(L, n);
		duplicateMin(L); 
		printList(L);
	}
	return 0;
}//
// 根据用户输入,创建顺序表 
void createList(SqList &L, int n)
{
	L.elem=new ElemType[MAXSIZE];
	L.length=0;
	int i=0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&L.elem[i]);
	}
	L.length=n;
}

// 打印表中元素,
// 每个元素后一个空格,输出全部元素后换行 	
void printList(SqList L)
{
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.elem[i]);
	}
	printf("\n");
}

// 复制非空顺序表中第一个的最小的元素 
void duplicateMin(SqList &L)
{
	int min=0,i=0,o=0;
	for(i=0;i<L.length;i++)
	{
		min=L.elem[0];
		if(min>L.elem[i])
		{
			min=L.elem[i];
			o=i;
		}
	}
	for(int j=L.length-1;j>=o;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[o]=min;
	L.length++;
}

0405

完成学生顺序表的初始化、输出、插入和删除操作。
假设列表的中学生是按照id升序排列的,并且学生的id不重复。
输入要求:
见代码注释
输出要求:
见代码注释
数据示例1:
输入:
1 121 aaa 20
1 121 aaa 20
2 121
1 123 abc 100
0
1 111 bbb 100
1 131 ccc 50
0
2 100
2 120 
2 133
0
2 111
2 131
0
输出:
123 abc 100

111 bbb 100
123 abc 100
131 ccc 50

111 bbb 100
123 abc 100
131 ccc 50

123 abc 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 16 // name最大字符数 
#define MAXS 20 // 最大学生数 

typedef struct{
	int id;
	char name[MAXN];
	int score;	// 成绩 
}Stud;

typedef struct{
	Stud *elem;
	int length;
}StdList;

// 初始化一个空的学生列表 
void init(StdList &L);

// 输出列表中的所有学生信息
// 包括id、name和成绩,中间以空格分隔  
void output(StdList L);

// 根据id, name, score,将学生插入到列表适当的位置 
// 如果用户输入的id已存在,则插入失败
// 不必考虑列表已满的情况 
void insert(StdList &L, int id, char *name, int score);

// 根据id删除学生 
// 如果id不存在,则删除失败 
void del(StdList &L, int id); 

int main(){
	StdList list;
	int cmd, id, score;
	char name[MAXN];
	init(list); 
	while (scanf("%d", &cmd) != EOF )  { // 选择操作 
		switch (cmd) {
		case 0:
			output(list);
			break;
		case 1:
			scanf("%d %s %d", &id, name, &score);
			insert(list, id, name, score);
			break; 
		case 2:
			scanf("%d", &id);
			del(list, id);
			break; 		
		}
	}
	return 0;
} 

// 初始化一个空的学生列表 
void init(StdList &L)
{
	L.elem=new Stud[MAXS];
	L.length=0;
}

// 输出列表中的所有学生信息
// 包括id、name和成绩,中间以空格分隔  
void output(StdList L)
{
	for(int i=0;i<L.length;i++)
	printf("%d %s %d\n",L.elem[i].id,L.elem[i].name,L.elem[i].score);
}

// 根据id, name, score,将学生插入到列表适当的位置 
// 如果用户输入的id已存在,则插入失败
// 不必考虑列表已满的情况 
void insert(StdList &L, int id, char *name, int score)
{
	int o=0; 
	for(int h=0;h<L.length;h++)
	{
		if(id==L.elem[h].id) o=1;// 如果用户输入的id已存在,则插入失败
	}
		if(o==0)
		{
			L.elem[L.length].id=id;
			strcpy(L.elem[L.length].name,name);
			L.elem[L.length].score=score;
			L.length++;	
		
			if(L.length>1)
			{
				for(int i=0;i<L.length-1;i++)
				{
					for(int p=0;p<L.length-i-1;p++)
					{
						if(L.elem[p].id>L.elem[p+1].id)
						{
							Stud temp=L.elem[p];
							L.elem[p]=L.elem[p+1];
							L.elem[p+1]=temp;
						}
					}
				}
			}	
		}
}
// 根据id删除学生 
// 如果id不存在,则删除失败 
void del(StdList &L, int id)
{
	int o=0,p=0;
	for(int i=0;i<L.length;i++)
	{
		if(id==L.elem[i].id){
			o=i;p=1;
		}
			
	}
	if(p==1)
	{
		for(int j=o;j<L.length-1;j++)
			L.elem[j]=L.elem[j+1];
		L.length--;
	}	
}

おすすめ

転載: blog.csdn.net/unhere123/article/details/115983962