对一个班某门课程成绩进行处理,用顺序表实现对一个班的一门课程成绩信 息的显示、查询、插入、删除功能,并对已排好序(非递减有序)的两个班成绩 合并,具体如下: 1.定义成绩顺序表结构体。 typedef struct SqList { ElemType*elem; int length; int capacity; }SqList,*Ptr; typedef Ptr SqListPtr;实现循环菜单显示选择,并完成以下菜单功能:
时间: 2023-06-05 14:06:44 浏览: 103
1. 显示成绩信息。
2. 查询成绩信息。
3. 插入成绩信息。
4. 删除成绩信息。
5. 合并两个班成绩信息。
6. 退出程序。
以下为代码示例:
#include <stdio.h>
#include <stdlib.h>
#define MAX_CAPACITY 100
typedef int ElemType;
typedef struct SqList
{
ElemType* elem;
int length;
int capacity;
} SqList, *Ptr;
typedef Ptr SqListPtr;
SqListPtr initSqList()
{
SqListPtr listPtr = (SqListPtr)malloc(sizeof(SqList));
listPtr->elem = (ElemType*)malloc(MAX_CAPACITY*sizeof(ElemType));
listPtr->length = 0;
listPtr->capacity = MAX_CAPACITY;
return listPtr;
}
void destroySqList(SqListPtr listPtr)
{
free(listPtr->elem);
free(listPtr);
}
void displayMenu()
{
printf("1. 显示成绩信息。\n");
printf("2. 查询成绩信息。\n");
printf("3. 插入成绩信息。\n");
printf("4. 删除成绩信息。\n");
printf("5. 合并两个班成绩信息。\n");
printf("6. 退出程序。\n");
}
void displayScores(SqListPtr listPtr)
{
if (listPtr->length == 0)
{
printf("当前没有成绩信息。\n");
return;
}
printf("当前成绩信息为:");
for (int i = 0; i < listPtr->length; i++)
{
printf("%d ", listPtr->elem[i]);
}
printf("\n");
}
void queryScore(SqListPtr listPtr)
{
if (listPtr->length == 0)
{
printf("当前没有成绩信息。\n");
return;
}
ElemType score;
printf("请输入要查询的成绩:");
scanf("%d", &score);
int index = -1;
for (int i = 0; i < listPtr->length; i++)
{
if (listPtr->elem[i] == score)
{
index = i;
break;
}
}
if (index == -1)
{
printf("没有找到该成绩。\n");
}
else
{
printf("要查询的成绩在顺序表中的位置为:%d。\n", index+1);
}
}
void insertScore(SqListPtr listPtr)
{
if (listPtr->length == listPtr->capacity)
{
printf("顺序表已满,无法插入新的成绩信息。\n");
return;
}
ElemType score;
int position;
printf("请输入要插入的成绩和插入位置(用空格隔开):");
scanf("%d %d", &score, &position);
if (position < 1 || position > listPtr->length+1)
{
printf("插入位置非法。\n");
return;
}
for (int i = listPtr->length; i >= position; i--)
{
listPtr->elem[i] = listPtr->elem[i-1];
}
listPtr->elem[position-1] = score;
listPtr->length++;
printf("插入成功!\n");
}
void deleteScore(SqListPtr listPtr)
{
if (listPtr->length == 0)
{
printf("当前没有成绩信息。\n");
return;
}
int position;
printf("请输入要删除的成绩位置:");
scanf("%d", &position);
if (position < 1 || position > listPtr->length)
{
printf("删除位置非法。\n");
return;
}
for (int i = position; i < listPtr->length; i++)
{
listPtr->elem[i-1] = listPtr->elem[i];
}
listPtr->length--;
printf("删除成功!\n");
}
void mergeScores(SqListPtr listPtr1, SqListPtr listPtr2)
{
if (listPtr1->length + listPtr2->length > listPtr1->capacity)
{
printf("合并后的成绩信息数量超出顺序表容量,无法合并。\n");
return;
}
int i = 0, j = 0;
while (i < listPtr1->length && j < listPtr2->length)
{
if (listPtr1->elem[i] <= listPtr2->elem[j])
{
i++;
}
else
{
for (int k = listPtr1->length-1; k >= i; k--)
{
listPtr1->elem[k+1] = listPtr1->elem[k];
}
listPtr1->elem[i] = listPtr2->elem[j];
i++;
j++;
listPtr1->length++;
}
}
while (j < listPtr2->length)
{
listPtr1->elem[listPtr1->length] = listPtr2->elem[j];
listPtr1->length++;
j++;
}
printf("成绩信息合并成功!\n");
}
int main()
{
SqListPtr listPtr1 = initSqList();
SqListPtr listPtr2 = initSqList();
int choice;
do
{
displayMenu();
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
displayScores(listPtr1);
displayScores(listPtr2);
break;
case 2:
queryScore(listPtr1);
queryScore(listPtr2);
break;
case 3:
insertScore(listPtr1);
insertScore(listPtr2);
break;
case 4:
deleteScore(listPtr1);
deleteScore(listPtr2);
break;
case 5:
mergeScores(listPtr1, listPtr2);
break;
case 6:
break;
default:
printf("输入的选择有误,请重新选择。\n");
break;
}
} while (choice != 6);
destroySqList(listPtr1);
destroySqList(listPtr2);
return 0;
}
阅读全文