广州大学学生实验报告
开课实验室:计算机科学与工程实验(电子楼416A) 2019年6月14日
学院 | 计算机科学与教育软件学院 | 年级、专业、班 | 计算机大类 144班 | 姓名 |
| 学号 |
| |
实验课程名称 | 数据结构实验 | 成绩 |
| |||||
实验项目名称 | 实验六 数据处理综合实验 | 指导老师 |
| |||||
一、实验目的 掌握线性的定义及基本操作,用链表实现:遍历、查找、插入、删除、翻转。 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 实验内容:
必填:身份(自己设计分类,例如:学生/体力劳动者/脑力劳动者) 年龄 性别 选填:自行设计单项选择题、填空题 例如:可接受的价格范围(自己设计,可以上限/下限,或某个值+上下浮动) 屏幕大小/整机大小 重量 颜色(也可以选择忽略,即不介意) 待机时间 拍照质量 音响效果 对以上各项指标重要程度的排序 ……
数据处理功能:自行基于问题的数据处理,例如
// ConsoleApplication76.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include <iostream> #include <fstream> #include"manage.h" using namespace std;
int main() { LinkNode *person; Createlink(person); ageR(person); identityR(person); brandR(person); sex_graph(person); }
#pragma once // 单链表基本运算算法 #include <stdio.h> #include <malloc.h> typedef int ElemType; #define MAXL 100 //最大长度 typedef int KeyType; //定义关键字类型为int typedef char InfoType; typedef struct LNode { int identity; //身份 0表示学生 1表示上班族 2表示退休人员 3表示其他 int age; //年龄段 0表示20岁以下 1表示21-50岁 2表示51岁以上 int sex; //性别 0表示男 1表示女
int brand; //手机的品牌 0表示OPPO 1表示vivo 2表示华为 3表示荣耀 4表示苹果 5表示小米 int price; //手机的价格区间 0表示1000以下 1表示1000-1999 2表示2000-2999 3表示3000以上 int size; // 手机屏幕的尺寸 0表示4.5英寸 1表示5.5英寸 2表示6英寸以上 int color; //手机的颜色 0表示黑 1表示白 2表示蓝 3表示其他 int graph; //0表示不介意 1表示基本清晰就可以 2表示拍照效果要好 int battery; //0表示续航久 1表示无所谓
struct LNode *next; //指向后继结点 } LinkNode; //声明单链表结点类型
typedef struct { KeyType key; //关键字项 char* data; //其他数据项,类型为InfoType } RecType; //查找元素的类型
void CreateListF(LinkNode *&L, ElemType id[], ElemType a[], ElemType sa[], ElemType b[], ElemType p[], ElemType si[], ElemType c[], ElemType g[], ElemType ba[], int n);
//尾插法建立单链表
void InitList(LinkNode *&L);
void DestroyList(LinkNode *&L);
void DispList(LinkNode *L);
bool GetElem(LinkNode *L, int i, ElemType &e);
void Createlink(LinkNode *&L);
void BubbleSort(RecType R[], int n);//冒泡排序
void CreateList(RecType R[], KeyType keys[], int n); //创建顺序表 void CreateListage(RecType R[], KeyType keys[], int n); //创建顺序表 void Createbrand(RecType R[], KeyType keys[], int n); //创建顺序表 void Creategraph(RecType R[], KeyType keys[], int n); //创建顺序表 void Createidentity(RecType R[], KeyType keys[], int n); //创建顺序表 void DispList(RecType R[], int n); //输出顺序表
void ageR(LinkNode *L); void identityR(LinkNode *L); void brandR(LinkNode *L); void sex_graph(LinkNode * L);
// 单链表基本运算算法 #include "stdafx.h" #include"manage.h" #include"iostream" using namespace std; void CreateListF(LinkNode *&L, ElemType id[], ElemType a[], ElemType sa[], ElemType b[], ElemType p[], ElemType si[], ElemType c[], ElemType g[], ElemType ba[], int n) //头插法建立单链表 { LinkNode *s; L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点 L->next = NULL; for (int i = 0; i<n; i++) { s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s s->identity = id[i]; s->age = a[i]; s->sex = sa[i]; s->brand = b[i]; s->price = p[i]; s->size = si[i]; s->color = c[i]; s->graph = g[i]; s->battery = ba[i]; s->next = L->next; //将结点s插在原开始结点之前,头结点之后 L->next = s; } }
void InitList(LinkNode *&L) { L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点 L->next = NULL; } void DestroyList(LinkNode *&L) { LinkNode *pre = L, *p = pre->next; while (p != NULL) { free(pre); pre = p; p = pre->next; } free(pre); //此时p为NULL,pre指向尾结点,释放它 } void DispList(LinkNode *L) { LinkNode *p = L->next; while (p != NULL) { printf("%d ", p->identity); p = p->next; } printf("\n"); } void ageR(LinkNode *L) { int age[3]; age[0] = 0; age[1] = 0; age[2] = 0; LinkNode *p = L->next; while (p != NULL) { if (p->age == 0)age[0]++; else if (p->age == 1)age[1]++; else if (p->age == 2)age[2]++; p = p->next; } printf("年龄在20岁以下的有%d人\n", age[0]); printf("年龄在21-50岁的有%d人\n", age[1]); printf("年龄在51岁以下的有%d人\n", age[2]); RecType R[3]; CreateListage(R, age,3); //创建顺序表 BubbleSort(R, 3); printf("最多人处在年龄阶段为:%s \n", R[0].data); } bool GetElem(LinkNode *L, int i, ElemType &e) { int j = 0; LinkNode *p = L; if (i <= 0) return false; //i错误返回假 while (j<i && p != NULL) { j++; p = p->next; } if (p == NULL) //不存在第i个数据结点 return false; else //存在第i个数据结点 { //e = p->data; return true; } }
void Createlink(LinkNode *& L) { FILE *stream1; freopen_s(&stream1,"C:\\test.txt", "r", stdin); //从文件中读取随机生成的调查对象 int num = 0; L = new LinkNode; L->next = NULL; LinkNode* p = new LinkNode; while (cin >> p->identity) { num++; //统计本次调查对象的人数 cin >> p->age >> p->sex >> p->brand >> p->price >> p->size >> p->color >> p->graph >> p->battery; p->next = L->next; L->next = p; p = new LinkNode; } delete p;
cout << "本次参与调查对象的人数有:" << num << "\n\n"; } //冒泡排序算法
void BubbleSort(RecType R[], int n) { int i, j, k; RecType tmp; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) //比较,找出本趟最小关键字的记录 if (R[j].key < R[j - 1].key) { tmp = R[j]; //R[j]与R[j-1]进行交换,将最小关键字记录前移 R[j] = R[j - 1]; R[j - 1] = tmp; } } } void CreateList(RecType R[], KeyType keys[], int n) { for (int i = 0; i < n; i++) //R[0..n-1]存放排序记录 R[i].key = keys[i]; } void CreateListage(RecType R[], KeyType keys[], int n) //创建顺序表 { for (int i = 0; i < n; i++) //R[0..n-1]存放排序记录 { R[i].key = keys[i]; } R[0].data = "20岁以下"; R[1].data = "20岁-51岁"; R[2].data = "51岁以上"; } void Createbrand(RecType R[], KeyType keys[], int n) { for (int i = 0; i < n; i++) //R[0..n-1]存放排序记录 { R[i].key = keys[i]; } R[0].data = "OPPO"; R[1].data = "vivo"; R[2].data = "华为"; R[3].data = "荣耀"; R[4].data = "苹果"; R[5].data = "小米";
} void Creategraph(RecType R[], KeyType keys[], int n) { for (int i = 0; i < n; i++) //R[0..n-1]存放排序记录 { R[i].key = keys[i]; } R[0].data = "表示不介意"; R[1].data = "表示基本清晰就可以"; R[2].data = "表示拍照效果要好"; } void Createidentity(RecType R[], KeyType keys[], int n) //创建顺序表 { for (int i = 0; i < n; i++) //R[0..n-1]存放排序记录 { R[i].key = keys[i]; } R[0].data = "学生"; R[1].data = "上班族"; R[2].data = "其他"; } void DispList(RecType R[], int n) //输出顺序表 { for (int i = 0; i < n; i++) printf("%d ", R[i].key); printf("\n"); }
void identityR(LinkNode *L) { int identity[3]; identity[0] = 0; identity[1] = 0; identity[2] = 0; LinkNode *p = L->next; while (p != NULL) { if (p->identity == 0)identity[0]++; else if (p->identity == 1)identity[1]++; else if (p->identity == 2)identity[2]++; p = p->next; } printf("身份是学生的有%d人\n", identity[0]); printf("身份是上班族的有%d人\n", identity[1]); printf("身份为其他的有%d人\n", identity[2]); RecType R[3]; Createidentity(R, identity, 3); //创建顺序表 BubbleSort(R, 3); printf("填选问卷身份最多的是:%s \n", R[0].data); }
void brandR(LinkNode * L) { int brand[6]; brand[0] = 0; brand[1] = 0; brand[2] = 0; brand[3] = 0; brand[4] = 0; brand[5] = 0; LinkNode *p = L->next; while (p != NULL) { if (p->brand == 0)brand[0]++; else if (p->brand == 1)brand[1]++; else if (p->brand == 2)brand[2]++; else if (p->brand == 3)brand[3]++; else if (p->brand == 4)brand[4]++; else if (p->brand == 5)brand[5]++; p = p->next; } printf("喜欢OPPO的有%d人\n", brand[0]); printf("喜欢vivo的有%d人\n", brand[1]); printf("喜欢华为的有%d人\n", brand[2]); printf("喜欢荣耀的有%d人\n", brand[3]); printf("喜欢苹果的有%d人\n", brand[4]); printf("喜欢小米的有%d人\n", brand[5]); RecType R[6]; Createbrand(R, brand, 6); //创建顺序表 BubbleSort(R, 6); printf("最受欢迎的品牌是:%s \n", R[5].data); }
void sex_graph(LinkNode * L)//0表示不介意 1表示基本清晰就可以 2表示拍照效果要好 { int graphman[3]; int graphfemale[3]; graphman[0] = 0; graphman[1] = 0; graphman[2] = 0; graphfemale[0] = 0; graphfemale[1] = 0; graphfemale[2] = 0; LinkNode *p = L->next; while (p != NULL) { if (p->sex == 0&&p->graph==0) graphman[0]++; else if (p->sex == 0 && p->graph == 1)graphman[1]++; else if (p->sex == 0 && p->graph == 2)graphman[2]++; else if (p->sex == 1 && p->graph == 0)graphfemale[0]++; else if (p->sex == 1 && p->graph == 1)graphfemale[1]++; else if (p->sex == 1 && p->graph == 2)graphfemale[2]++;
p = p->next; }
RecType R1[3]; RecType R2[3]; Creategraph(R1, graphman, 3); //创建顺序表 Creategraph(R2, graphfemale, 3); //创建顺序表 BubbleSort(R1, 3); BubbleSort(R1, 3); printf("男性对手机相机的态度更注重于:%s \n", R2[0].data); printf("女性对手机相机的态度更注重于:%s \n", R1[0].data); }
五、实验结果及分析
问卷链接:https://www.wjx.cn/jq/40339278.aspx 问卷截图
实验中使用链表存储结构,使用了冒泡排序。对数据处理有些采用了关联数据处理,例如把性别和对相机注重数据联合在一起分析。由于电脑损坏,重新写了一次,因此对某些数据做了简单分析。
| ||||||||
|