前言
-
蓝桥杯题目太多刷不过来怎么办?不如先用链表实现一个在一定范围内选取若干个去重的随机数的程序!!!
-
所以,这是一个用链表实现的随机数程序。
-
所以,还没开始刷蓝桥杯的题,因为在刷题前感觉题目多了没必要也没时间,所以不如摇色子决定!
程序实现
主要函数
Status equal(ElemType c1, ElemType c2); // 判断是否相等的函数,Union()用到
Status InitList(LinkList &L); //创建一个空链表
Status ListInsert(LinkList L, ElemType e); //插入
Status ExistElem(LinkList L, ElemType e, Status (*compare)(ElemType, ElemType)); //检查新生成的随机数是否已经存在于链表中
Status PrintList(LinkList L); //打印链表
Status ListInOder(LinkList L); //用原始的冒泡排序对链表进行整理
代码汇总
#include <iostream>
#include <time.h>
using namespace std;
const int TRUE = 1;
const int ERROR = 0;
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType rand_Num;
LNode *next;
} * LinkList;
Status equal(ElemType c1, ElemType c2)
{ // 判断是否相等的函数,Union()用到
if (c1 == c2)
return TRUE;
else
return ERROR;
}
Status InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if (!L)
exit(ERROR);
L->next = NULL;
return TRUE;
}
Status ListInsert(LinkList L, ElemType e)
{
LinkList p = L, s;
s = (LinkList)malloc(sizeof(LNode));
s->rand_Num = e;
s->next = p->next;
p->next = s;
return TRUE;
}
Status ExistElem(LinkList L, ElemType e, Status (*compare)(ElemType, ElemType)) //函数指针别名
{
LinkList p = L->next;
while (p)
{
if (compare(p->rand_Num, e))
return ERROR;
p = p->next;
}
return TRUE;
}
Status PrintList(LinkList L)
{
LinkList p = L->next;
while (p)
{
cout << p->rand_Num << endl;
p = p->next;
}
return TRUE;
}
Status ListInOder(LinkList L)
{
LinkList p = L;
p = p->next;
while (p)
{
LinkList q = L->next;
while (q)
{
if (p->rand_Num < q->rand_Num)
{
int t = q->rand_Num;
q->rand_Num = p->rand_Num;
p->rand_Num = t;
}
q = q->next;
}
p = p->next;
}
return TRUE;
}
int main()
{
LinkList L;
int a, b, n;
cout << "输入随机数范围:";
cin >> a >> b;
cout << "输入随机数个数:";
cin >> n;
InitList(L);
srand((unsigned)time(0));
for (int i = 0; i < n; i++)
{
int num = rand() % (b - a + 1) + a;
if (ExistElem(L, num, equal))
ListInsert(L, num);
else
i--;
}
ListInOder(L);
cout << "产生的随机数为:" << endl;
PrintList(L);
return 0;
}
总结反思
- 拒绝拖延!!!