数据结构线性表两种方式分享
第一种方式为老师说的数组+结构体(课本上),我用的是c++,其实与c没什么不同(区别:cin是scanf,cout是print,new是malloc()函数),我用的全局变量,所以不用传参。
代码1:
点击查看代码
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e4 + 5;
struct ss {
char name[10], str[15];
double test;
};
struct kk {
ss data[N];
int length;
}tests;
void scanfs(int);
void print();
void find1(char x[]);
void find2(int);
void cha(ss, int);
void shan(int);
int main() {
int n, h;
cout << "请输入初始成绩表人数:\n";
cin >> n;
scanfs(n);
while (true) {
cout << "请选择您的操作:\n";
cout << "1:输出全部成绩表\n";
cout << "2:按姓名查找\n";
cout << "3:按指定位置查找\n";
cout << "4:在指定位置插入成绩\n";
cout << "5:删除指定位置信息\n";
cout << "6:成绩表中的人数\n";
cout << "7:退出:\n";
cin >> h;
if (h == 7) break;
if (h > 7 || h < 1) cout << "输入错误!\n";
switch (h) {
case 1:print(); break;
case 2:char x[10];
cout << "请输入您要查找的姓名:\n";
cin >> x;
find1(x); break;
case 3:int k;
cout << "请输入您要查找的位置:\n";
cin >> k;
find2(k); break;
case 4:ss x1; int k1;
cout << "请按学号、姓名、成绩、位置的顺序输入;\n";
cout << "学号:\n"; cin >> x1.str;
cout << "姓名:\n"; cin >> x1.name;
cout << "成绩:\n"; cin >> x1.test;
cout << "插入位置\n"; cin >> k1;
cha(x1, k1); break;
case 5:int k2;
cout << "请输入您要删除的位置:\n";
cin >> k2;
shan(k2); break;
case 6:cout << "人数为:" << tests.length << endl;
}
cout << "----------输入任意键返回----------\n";
getchar(); getchar();
}
return 0;
}
void scanfs(int n) {
cout << "请按学号、姓名、成绩的顺序输入;\n";
for (int i = 1; i <= n; i++) {
printf("-----学生%d-----\n", i);
cout << "学号:\n"; cin >> tests.data[i].str;
cout << "姓名:\n"; cin >> tests.data[i].name;
cout << "成绩:\n"; cin >> tests.data[i].test;
}
tests.length = n;
}
void print() {
if (tests.length == 0) {
cout << "暂为空表\n";
return;
}
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
for (int i = 1; i <= tests.length; i++)
printf("%15s%10s%8.2lf\n", tests.data[i].str, tests.data[i].name, tests.data[i].test);
}
void find1(char x[]) {
for (int i = 1; i <= tests.length; i++)
if (strcmp(x, tests.data[i].name) == 0) {
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
printf("%15s%10s%8.2lf\n", tests.data[i].str, tests.data[i].name, tests.data[i].test);
return;
}
printf("查无此人!\n");
}
void find2(int k) {
if (k > 0 && k <= tests.length) {
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
printf("%15s%10s%8.2lf\n", tests.data[k].str, tests.data[k].name, tests.data[k].test);
return;
}
printf("查无此人!\n");
}
void cha(ss x, int k) {
if (tests.length == N) {
printf("内存已满!\n");
return;
}
if (k > tests.length + 1) {
printf("插入不在成绩表中,请重新选择插入位置\n");
return;
}
tests.length++;
for (int i = tests.length; i > k; i--)
tests.data[i] = tests.data[i - 1];
tests.data[k] = x;
}
void shan(int k) {
if (k<1 || k>tests.length) {
cout << "删除位置不在成绩表内\n";
return;
}
for (int i = k; i < tests.length; i++)
tests.data[i] = tests.data[i + 1];
tests.length--;
}
第二种方式是链表,是上一种稍微做了改变(报告是两种方式都要哦!)
代码2:
点击查看代码
#include<iostream>
#include<cstring>
using namespace std;
struct ss {
char name[10], str[15];
double test;
ss* next;
};
ss* head;
int num;
void scanfs(int);
void print();
void find1(char x[]);
void find2(int);
void cha(ss, int);
void shan(int);
int main() {
int n, h;
cout << "请输入初始成绩表人数:\n";
cin >> n;
scanfs(n);
while (true) {
cout << "请选择您的操作:\n";
cout << "1:输出全部成绩表\n";
cout << "2:按姓名查找\n";
cout << "3:按指定位置查找\n";
cout << "4:在指定位置插入成绩\n";
cout << "5:删除指定位置信息\n";
cout << "6:成绩表中的人数\n";
cout << "7:退出:\n";
cin >> h;
if (h == 7) break;
if (h > 7 || h < 1) cout << "输入错误!\n";
switch (h) {
case 1:print(); break;
case 2:char x[10];
cout << "请输入您要查找的姓名:\n";
cin >> x;
find1(x); break;
case 3:int k;
cout << "请输入您要查找的位置:\n";
cin >> k;
find2(k); break;
case 4:ss x1; int k1;
cout << "请按学号、姓名、成绩、位置的顺序输入;\n";
cout << "学号:\n"; cin >> x1.str;
cout << "姓名:\n"; cin >> x1.name;
cout << "成绩:\n"; cin >> x1.test;
cout << "插入位置\n"; cin >> k1;
cha(x1, k1); break;
case 5:int k2;
cout << "请输入您要删除的位置:\n";
cin >> k2;
shan(k2); break;
case 6:cout << "人数为:" << num<< endl;
}
cout << "----------输入任意键返回----------\n";
getchar(); getchar();
}
return 0;
}
void scanfs(int n) {
ss *te,*p;
head = new ss;
p = new ss;
head->next = nullptr;
cout << "请按学号、姓名、成绩的顺序输入;\n";
for (int i = 1; i <= n; i++) {
te = new ss;
printf("-----学生%d-----\n", i);
cout << "学号:\n"; cin >> te->str;
cout << "姓名:\n"; cin >> te->name;
cout << "成绩:\n"; cin >> te->test;
te->next = nullptr;
if (i == 1) head->next = te;
else p->next = te;
p = te;
}
num = n;
}
void print() {
if (head->next == nullptr) {
cout << "暂为空表\n";
return;
}
ss* te=head->next;
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
while (te != nullptr) {
printf("%15s%10s%8.2lf\n", te->str, te->name, te->test);
te = te->next;
}
}
void find1(char x[]) {
ss* te = head->next;
while (te != nullptr) {
if (strcmp(x, te->name) == 0) {
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
printf("%15s%10s%8.2lf\n", te->str, te->name, te->test);
return;
}
te = te->next;
}
printf("查无此人!\n");
}
void find2(int k) {
ss* te = head->next;
int p = 0;
while (te!= nullptr && p < k-1) {
te = te->next;
p++;
}
if (k > 0 && k <= num) {
printf("%15s%10s%8s\n", "学号", "姓名", "成绩");
printf("%15s%10s%8.2lf\n", te->str, te->name, te->test);
return;
}
printf("查无此人!\n");
}
void cha(ss x, int k) {
ss* te,*p=head;
int p1 = 0;
if (k > num + 1) {
printf("插入不在成绩表中,请重新选择插入位置\n");
return;
}
num++;
te = &x;
while (p->next != nullptr && p1++ < k-1)
p = p->next;
te->next = p->next;
p->next = te;
}
void shan(int k) {
if (k<1 || k>num) {
cout << "删除位置不在成绩表内\n";
return;
}
ss* p = head,*te;
int p1 = 0;
while (p->next != nullptr && p1++ < k-1)
p = p->next;
te = p->next;
p->next = te->next;
delete te;
num--;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步