数据结构2

大二开始都一个多月了,自从网赛之后就没多少刷题的欲望了,弱爆了,orz.

这个月没刷什么题,所以怒刷水题,感觉越刷越水了...

学校的课也没什么理由想去翘了,还是老老实实上课吧

数据结构还是蛮烦人的:

 

实 验 二

假设一学生信息文件中每个学生信息包括:学号(8位字符)、姓名(10个字符)、成绩(整型)及所用时间(整型),要求从该文件中读取每个学生的信息存入一双向循环链表中,然后按快速排序算法对其排序;排序的规则是:按成绩从高到低,成绩相同时所用时间少者在先,多者在后。要求输出排序后的结果。

 

#include <iostream>
#include <cstdio>
using namespace std;
typedef struct miao
{
    char name[11];
    int no,grade,time;
}miao;
typedef struct DulNode
{
    miao data;
    DulNode *prior,*next;
    DulNode()
    {
        prior=this;
        next=this;
    }
}*DulLinkList;
DulLinkList L;
void Insert(DulNode *p,DulNode *s)
{
    s->prior=p->prior;  p->prior->next=s;
    s->next=p;    p->prior=s;
}
int cmp(miao p,miao q)
{
    if(p.grade==q.grade)
    {
        return p.time<=q.time;
    }
    return p.grade>=q.grade;
}
DulNode *partition(DulNode *l,DulNode *r)
{
    miao key=l->data;
    while(l!=r)
    {
        while(l!=r&&cmp(key,r->data))
            r=r->prior;
        if(l!=r)
        {
            l->data=r->data;
            l=l->next;
        }
        while(l!=r&&cmp(l->data,key))
            l=l->next;
        if(l!=r)
        {
            r->data=l->data;
            r=r->prior;
        }
    }
    l->data=key;
    return l;
}
void Quick_Sort(DulNode *p,DulNode *q)
{
    DulNode *r;
    if(p!=q)
    {
        r=partition(p,q);
        if(r!=p)
            Quick_Sort(p,r->prior);
        if(r!=q)
            Quick_Sort(r->next,q);
    }
}
void Create()
{
    DulNode *s;
    while(s=new DulNode,scanf("%d",&s->data.no)!=EOF)
    {
        scanf("%s%d%d",s->data.name,&s->data.grade,&s->data.time);
        if(L==NULL)
            L=s;
        else
            Insert(L,s);
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    Create();
    Quick_Sort(L,L->prior);
    DulNode *p;
	p = L;
	printf("   ID          name      grade    time\n");
	printf("%08d %10s %8d %8d\n", L->data.no, L->data.name, L->data.grade,L->data.time);
    p = p->next;
	while(p!=L)
	{
		printf("%08d %10s %8d %8d\n", p->data.no, p->data.name, p->data.grade,p->data.time);
		p = p->next;
	}
	return 0;
}


然后输入输出文件我写的分别是:

20112101 张三 67 88
20112102 李四 56 89
20112103 王五 87 98
20112106 吴六 99 66
20112104 陈七 99 65
20112105 刘八 77 98

 

   ID          name      grade    time
20112104       陈七       99       65
20112106       吴六       99       66
20112103       王五       87       98
20112105       刘八       77       98
20112101       张三       67       88
20112102       李四       56       89

感觉还好,开始的时候写了个,因为野指针太多了直接被华哥否定了....

 

 

然后估计就是开始了栈和队列的学习

(p.s. 记得暑假的时候这些东西都是直接用的,喵的,写这么多恶心的函数)

 顺序栈基本操作:

#include <iostream>
#include <cstdio>
using namespace std;
const int STACKSIZE=100;
const int INCREMENT=10;

typedef struct
{
	int *elem;
	int top;
	int stacksize;
	int increment;
}SqStack;
void Init(SqStack &S)
{
	S.elem=new int[STACKSIZE];
	S.top=0;
	S.stacksize=STACKSIZE;
	S.increment=INCREMENT;
}
void Destroy(SqStack &S)
{
	delete S.elem;
	S.top=0;
	S.stacksize=0;
}
void Clear(SqStack &S)
{
	S.top=0;
}
int Top(SqStack S)
{
	if(S.top==0)
	{
		cout<<"空栈,输入不合法!"<<endl;
		return 0;
	}
	else
		return S.elem[S.top];
}
int Empty(SqStack S)
{
	if(S.top==0)
		return 1;
	else
		return 0;
}
void Push(SqStack &S,int e)
{
    if(Empty(S))
    {
        S.elem=new int[STACKSIZE];
    }
	if(S.top==S.stacksize-1)
    {
        int a[INCREMENT+S.stacksize];
        for(int i=1;i<S.stacksize;i++)
        a[i]=S.elem[i];
        delete S.elem;
        S.elem=a;
        S.stacksize+=INCREMENT;
    }
	S.elem[++S.top]=e;
}
void Pop(SqStack &S,int &e)
{
	if(Empty(S))
	{
		cout<<"空栈,输入不合法!"<<endl;
		return ;
	}
	else
		e=S.elem[S.top--];
}
void Traverse(SqStack S)
{
	cout<<S.elem[1];
	for(int i=2;i<=S.top;i++)
		cout<<" "<<S.elem[i];
	cout<<endl;
	cout<<S.top<<endl;
}
int main()
{
	SqStack S;
	Init(S);
	//Clear(S);
    Destroy(S);
    for(int i=1;i<=5;i++)
		Push(S,i);
	Traverse(S);
	return 0;
}


 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值