Skip to content

学生信息顺序表/链表 #8

@FocusOn1

Description

@FocusOn1

学生信息顺序表

#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型

#define MAXSIZE 100			//顺序表可能达到的最大长度
/*
struct Student {
	string id;//学号
	string name;//人名
	int grade;//成绩 
};
*/
typedef struct {
    char id[12];   //12位学号
    char name[20]; //姓名
    int grade;     //成绩
}Student;

typedef struct {
	Student *elem; //存储空间的基地址
	int length; //当前长度
} SqList;

Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
	//构造一个空的顺序表L
	L.elem = new Student[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
	if (!L.elem)
		exit(OVERFLOW); //存储分配失败退出
	L.length = 0; //空表长度为0
	return OK;
}

Status GetElem(SqList L, int i, Student &e) {//算法2.2 顺序表的取值
	if (i < 1 || i > L.length)
		return ERROR; //判断i值是否合理,若不合理,返回ERROR
	e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
	return OK;
}

int LocateElem_Sq(SqList L, int e) { //算法2.3 顺序表的查找
	//顺序表的查找
	for (int i = 0; i < L.length; i++)
		if (L.elem[i].grade == e)
			return i + 1;//查找成功,返回序号i+1
	return 0;//查找失败,返回0
}

Status ListInsert_Sq(SqList &L, int i, Student e) { //算法2.4 顺序表的插入
	//在顺序表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_Sq(SqList &L, int i) { //算法2.5 顺序表的删除
	//在顺序表L中删除第i个元素,并用e返回其值
	//i值的合法范围是1<=i<=L.length
	if ((i < 1) || (i > L.length))
		return ERROR; //i值不合法
	for (int j = i; j <= L.length; j++)
		L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
	--L.length; //表长减1
	return OK;
}

int main() {
	SqList L;
	int i = 0, temp, a, c, choose;
	int grade;
	Student e;
	string head_1, head_2, head_3;
	cout << "1. 建立\n";
	cout << "2. 输入\n";
	cout << "3. 取值\n";
	cout << "4. 查找\n";
	cout << "5. 插入\n";
	cout << "6. 删除\n";
	cout << "7. 输出\n";
	cout << "0. 退出\n\n";

	choose = -1;
	while (choose != 0) {
		cout << "请选择:";
		cin >> choose;
		switch (choose) {
		case 1://创建顺序表
			if (InitList_Sq(L))
				cout << "成功建立顺序表\n\n";
			else
				cout << "顺序表建立失败\n\n";
			break;
		case 2: {//顺序表信息输入
			i = 0;
			L.elem = new Student[MAXSIZE];
			if (!L.elem)
				exit(OVERFLOW);
			L.length = 0;
			fstream file;
			file.open("student.txt");
			if (!file) {
				cout << "错误!未找到文件!" << endl;
				exit(ERROR);
			}
			file >> head_1 >> head_2 >> head_3;
			while (!file.eof()) {
				file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].grade;
				i++;
			}
			cout << "输入 student.txt 信息完毕\n\n";
			L.length = i;
			file.close();
		}
			break;
		case 3://顺序表的取值
			cout << "请输入一个位置用来取值:\n";
			cin >> i;
			temp = GetElem(L, i, e);
			if (temp != 0) {
				cout << "查找成功\n";
				cout << "第" << i << "个学生的信息是:\n";
				cout << left << setw(15) << e.id << "\t" << left << setw(50)
						<< e.name << "\t" << left << setw(5) << e.grade << endl
						<< endl;
			} else
				cout << "查找失败!位置超出范围\n\n";
			break;
		case 4: //顺序表的查找
			cout << "请输入所要查找成绩:";
			cin >> grade;
			temp = LocateElem_Sq(L, grade);
			if (temp != 0) {
				cout << "查找成功\n";
				cout << "该成绩对应的学生为:" << L.elem[temp - 1].name << endl << endl;
			} else
				cout << "查找失败!没有这个成绩对应的学生\n\n";
			break;
		case 5: //顺序表的插入
			cout << "请输入插入的位置和学生信息,包括:学号 姓名 成绩(用空格隔开):";
			cin >> a;
			cin >> e.id >> e.name >> e.grade; //输入a和b,a代表插入的位置,b代表插入的数值(学生信息)
			if (ListInsert_Sq(L, a, e))
				cout << "插入成功.\n\n";
			else
				cout << "插入失败.\n\n";
			break;
		case 6: //顺序表的删除
			cout << "请输入所要删除的学生的位置:";
			cin >> c;
			if (ListDelete_Sq(L, c))
				cout << "删除成功.\n\n";
			else
				cout << "删除失败.\n\n";
			break;
		case 7: //顺序表的输出
			cout << "当前学籍系统信息(顺序表)读出:\n";
			for (i = 0; i < L.length; i++)
				cout << left << setw(15) << L.elem[i].id << "\t" << left
						<< setw(50) << L.elem[i].name << "\t" << left
						<< setw(5) << L.elem[i].grade << endl;
			cout << endl;
			break;
		}
	}
	return 0;
}

学生信息链表

#include<stdio.h>
#include<string.h>
typedef struct student
{
    int num;
    char name[10];
    float score[3];
}DataType;
typedef struct LNode
{
    DataType data;
    struct LNode *next;
}LNode,*LinkList;
//建立带头链表-头插法  
LNode* Creat_LinkList1()
{
    LinkList L;//创建链表
    LNode *p;//p作为待插入节点
    int flag=0;
    printf("请输入这五名学生的学号、姓名和三科成绩:\n");
    L->next=NULL;
    while(flag!=5)
    {
        flag++;
        p=new LNode;
        scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        p->next=L->next;
        L->next=p;
    }
    return L;
}
//建立带头链表-尾插法  
LNode* Creat_LinkList2()
{
    LinkList L=new LNode;//创建链表
    LNode *s,*p;//p作为待插入节点,s作为尾结点
    int flag=0;
    printf("请输入这五名学生的学号、姓名和三科成绩:\n");
    L->next=NULL;
    s=L;
    while(flag!=2)
    {
        flag++;
        p=new LNode;
        scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
        s->next=p;
        s=p;
    }
    s->next=NULL;
    return L;
}
//求链表的长度   
int Length_LinkList(LinkList L)
{
    LNode *p;
    p=L;
    int len=0;
    while(p->next)
    {
        p=p->next;
        len++;
    }
    return len;
}
//按序号查找   
LNode* Get_LinkList(LinkList L,int i)
{
    LNode *p;
    int num=0;
    p=L;
    while((p->next)&& num<i)
    {
        p=p->next;
        num++;
    }
    return p;
}
//按值查找   
LNode* Locate_LinkList(LinkList L,DataType x)
{
    LNode *p;
    p=L;
    while(p->next&&p->data.num!=x.num&&p->data.name!=x.name)
        p=p->next;
    return p;
}
//插入元素  
int Insert_LinkList(LinkList L,int i,DataType x)
{
 
    LNode *p,*s;//s是待插入的结点
    p=Get_LinkList(L,i-1);//查找第i个元素的前驱
    if(p==NULL)
        return 0;//第i-1个结点不存在
    else
    {
        s=new LNode;
        s->data=x;
        s->next=p->next;
        p->next=s;
        return 1;
    }
}
//删除元素  
int Delete_LinkList(LinkList L,int i)
{
    LNode *p,*s;
    p=Get_LinkList(L,i-1);
    if(p==NULL)
        return -1;
    else
    {
        if(p->next==NULL)
            return 0;
        else
        {
            s=p->next;
            p->next=s->next;//逻辑上删除
            delete s;//物理上删除
            return 1;
        }
    }
}
//链表倒置   
void Reverse_LinkList(LinkList L)
{
    LNode *p,*q;
    p=L->next;
    L->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        q->next=L->next;
        L->next=q;
    }
}
//删除链表中的重复结点  
void Pur_LinkList(LinkList L)
{
    LNode *p,*q,*r;
    p=L->next;
    while(p)
    {
        q=p;
        while(q->next)
        {
            if(p->data.num==q->next->data.num&&p->data.name==q->data.name)
            {
                r=q->next;
                q->next=r->next;
                delete r;
            }
            else
                q=q->next;
        }
        p=p->next;
    }
}
//显示链表中的所有信息及所有的学生信息  
void Print_LinkList(LinkList L)
{
    printf("学号   姓名   A科成绩   B科成绩   C科成绩\n");
    LNode *p;
    p=L->next;
    while(p)
    {
        printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
        p=p->next;
    }
}
//显示链表中结点的信息及某同学的信息 
void Print_LNode(LNode *p)
{
    printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
}
int main()
{
    LinkList L;
    L=Creat_LinkList1();
    Print_LinkList(L);
    int flag;
    printf("请输入你需要进行的操作:\n");
    printf("1.统计学生总数\n");
    printf("2.通过位置查找学生信息\n");
    printf("3.通过学生学号和姓名查找学生信息\n");
    printf("4.插入学生信息\n");
	printf("5.删除学生信息\n");
	printf("6.逆序学生信息\n");
	printf("7.删除重复的学生信息\n");
	scanf("%d",&flag);
	if(flag==1)
    {
        printf("链表中存储了%d个学生的信息。\n",Length_LinkList(L));
    }
    if(flag==2)
    {
        printf("请输入你想查找学生信息的位置:\n");
        int site;
        scanf("%d",&site);
        LNode *p;
        p=Get_LinkList(L,site);
        if(p==NULL)
            printf("没有找到该学生的信息!");
        else
        {
            printf("第%d位同学的学号、姓名及各课成绩为:\n",site);
            Print_LNode(p);
        }
    }
    if(flag==3)
    {
        LNode *p;
        DataType d1;
        printf("请输入学生的学号和姓名:\n");
        scanf("%d %s",&d1.num,d1.name);
        p=Locate_LinkList(L,d1);
        if(p==NULL)
            printf("没有找到该学生的信息!");
        else
        {
            printf("这位同学的学号、姓名及各课成绩为:\n");
            Print_LNode(p);
        }
    }
    if(flag==4)
    {
        DataType d2;
        int location,flag1=0;
        printf("请输入你要插入的学生的位置和信息:\n");
        scanf("%d %d %s %f %f %f",&location,&d2.num,d2.name,&d2.score[0],&d2.score[1],&d2.score[2]);
        //flag1=Insert_LinkList(L,location,d2);
        if(flag1==0)
            printf("插入位置不合法!");
        else
            printf("插入成功!");
        Print_LinkList(L);
    }
    if(flag==5)
    {
        int flag2,site1;
        printf("请输入你想删除学生信息的位置:\n");
        scanf("%d",&site1);
        flag2=Delete_LinkList(L,site1);
        if(flag2==-1||flag2==0)
            printf("删除的位置不合法。\n");
        else
            printf("删除成功!\n");
        Print_LinkList(L);
    }
    if(flag==6)
    {
        Reverse_LinkList(L);
        Print_LinkList(L);
    }
    if(flag==7)
    {
        Pur_LinkList(L);
        Print_LinkList(L);
    }
    return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions