关于线性表的综合操作
顺序表
@[TOC](文章目录)
前言
综合掌握顺序表的创建、排序、查找、插入、删除、修改等操作。
1. 基于顺序存储结构的图书信息表的创建和输出
定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后统计图书表中的图书个数,同时逐行输出每本图书的信息。
输入
输入 n+1 行,其中前 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后第 n+1 行是输入结束标志:0 0 0(空格分隔的三个 0)。其中书号和书名为字符串类型,价格为浮点数类型。
输出
总计 n+1 行,第 1 行是所创建的图书表中的图书个数,后 n 行是 n 本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔。其中价格输出保留两位小数。
输入样例
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第 2 版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
0 0 0
输出样例
6
9787302257646 程序设计基础 25.00
9787302164340 程序设计基础(第 2 版) 20.00
9787302219972 单片机技术及应用 32.00
9787302203513 单片机原理与应用技术 26.00
9787810827430 工业计算机控制技术——原理与应用 29.00
9787811234923 汇编语言程序设计教程 21.00
代码如下:
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct {
char no[20]; //图书ISBN
char name[50]; //图书名字
float price; //图书价格
}Book;
typedef struct {
Book* elem; //存储空间的基地址
int length; //图书表中当前图书个数
}SqList; //图书馆的顺序存储结构类型为SqList
typedef Book Elemtype;
Status InitList(SqList* L) {
//L->elem = (Elemtype*)malloc(sizeof(Elemtype)*MAXSIZE);
L->elem = new Book[MAXSIZE];
//malloc的返回值是一个指针,指向一段可用内存的起始地址
if (!L->elem)
exit(-2);
L->length = 0;
return OK;
}
int main() {
int i;
SqList L;
InitList(&L);
Book b[MAXSIZE];
for (i = 0; i < MAXSIZE; i++) {
scanf("%s %s %f", &b[i].no, &b[i].name, &b[i].price);
if (!strcmp(b[i].no, "0") && !strcmp(b[i].name, "0") && (b[i].price == 0)) break;
}
printf("%d\n", i );
for (int j = 0; j < i; j++) {
printf("%s %s %.2f\n", b[j].no, b[j].name, b[j].price);
}
}
2. 基于顺序存储结构的图书信息表的排序
代码如下
需注意 下面这个函数的实现是采用的另一种插入方法,意在让同学们了解排序的实质 从而可以自己独立的进行编写程序
void SortTable(SqList*T){
for(int i=0;i<T->length;++i){
for(int j=i+1;j<T->length;++j){
if(T->date[i].price<T->date[j].price){
Book temp;
temp=T->date[i];
T->date[i]=T->date[j];
T->date[j]=temp;
}
}
}
}
3. 基于顺序存储结构的图书信息表的修改
注意该函数的实现要先把握对顺序表的遍历,通过遍历的方法实现对价格的求和 从而将average作为条件来进行价格的变动
void ChangePrice(SqList *T){
float sum=0;
for(int i=0;i<T->length;++i){
sum+=T->date[i].price;
}
float average = sum/T->length;
printf("%.2f\n",average);
for(int i=0;i<T->length;++i){
if(T->date[i].price>=average){
T->date[i].price*=1.1;
}else{
T->date[i].price*=1.2;
}
}
}
4.基于顺序存储结构的图书信息表的新图书的入库与出库
插入和删除是类似的在这里我们一起说,有新的同学看到下面代码也可以发现,我写的删除是直接把插入的拿过来直接修改的
在插入和删除里面我们最关心的是要操作节点的前一个元素通过输入的n,我们确定好所操作节点的前一个节点的位置,剩下的插入无非就是将插入位置及之后的元素右移,将要插入的元素插入到已经空出的位置。同理删除某个节点的操作就比插入更简单,就是直接将所删除元素及以后的元素统一向前覆盖即可(注意覆盖的方向)
Status ListInsert(SqList& L, int i, Elemtype e) {
//在顺序表L中第i个位置之前插入新的元素e,i值的合法范围是1<=i<=L.length+1
if ((i < 1) || (i > L.length + 1)) return ERROR;//i值不合法
if (L.length == MAXSIZE) return ERROR;//当前存储空间已满
for (int j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];//插入位置及之后的元素右移
}
L.elem[i - 1] = e;//将新元素e放入第i个位置
++L.length;//表长加1
return OK;
}
Status ListDelete(SqList& L, int i) {
if ((i < 1) || (i > L.length + 1)) return ERROR;//i值不合法
//if (L.length == MAXSIZE) return ERROR;//当前存储空间已满
for (int j = i-1; j <= L.length-1; j++) {
L.elem[j] = L.elem[j+1];//删除位置及之后的元素左移
}
//L.elem[i - 1] = e;
--L.length;//表长-1
return OK;
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。