include cstdlib 或 #include stdlib.h
创新互联公司专业为企业提供白水网站建设、白水做网站、白水网站设计、白水网站制作等企业网站建设、网页设计与制作、白水企业网站模板建站服务,十载白水做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
参数表
*base: 待排序的元素(数组,下标0起)。
num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。
int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。
比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。
控制返回值可以确定升序/降序。
产生随机数的函数也是rand(),不是rank().
两种方案,直接用数学方法计算和转为为字符串。
第一:数学方法,对于任意一个数n,要计算第site位的数,都可以用
n/10^(site-1)%10计算出来。比如计算123各位数:
int data=123;
printf("%d\n",data/100%10);
printf("%d\n",data/10%10);
printf("%d\n",data/1%10);结果是:
搜狗问问
第二:转化为字符串,这里要用到一个函数itoa。同样是计算123各个位数。
代码:
int data = 123;
char array[100];
itoa(data, array, 10); //转化为字符串
printf("%c\n", array[0]);
printf("%c\n", array[1]);
printf("%c\n", array[2]);结果和上面一样!
两种方式都能计算出,但是第一种方式计算未知位数的数时很麻烦,要首先计算出数的位数,相比较第二种就没那问题,只要定义足够大的数组就不存在这个问题。
上面既有排序,又有合并,不想要合并的话,把跟这个函数有关的函数,和调用删除就行了!!!
#includestdio.h
#includestdlib.h
struct LNode //创建链表结点
{ int data;
struct LNode *next;
};
struct LNode *creat() //链表创建函数
{ struct LNode *head,*p,*rear;
int x,n;
head=(struct LNode *)malloc(sizeof(struct LNode));//链表头指针
rear=head;
puts("输入链表元素,以0结束:");
scanf("%d",x); //链表元素输入
while(x) //链表节点链接
{ p=(struct LNode *)malloc(sizeof(struct LNode));
p-data=x; rear-next=p;
rear=p; scanf("%d",x);
}
rear-next=NULL;
return head-next; //返回链表中第一个有值结点地址
}
struct LNode *Merger_Linklist( struct LNode *L1,struct LNode *L2 ) //链表合并函数
{ struct LNode *p;
for(p=L1;p-next!=NULL;p=p-next) //查找链表L1的尾结点地址
{ if(p-next==NULL)
break;
}
p-next =L2; //将链表L2链接在L1之后
return L1;
}
struct LNode *Rand(struct LNode *L) //链表排序函数
{ struct LNode *Cur; //当前节点
struct LNode *Next; //遍历未排序节点
struct LNode *min; //指向未排序节点中最小节点
int temp;
for(Cur = L; Cur-next!= NULL; Cur = Cur-next)
//从头节点的下一个节点开始,一直到倒数第二个节点
{ min = Cur;
for(Next = Cur-next; Next != NULL; Next = Next-next)
{ if(min-data Next-data)
{min = Next;}
}
temp = Cur-data; //链表数值交换
Cur-data = min-data;
min-data = temp;
}
return L;
}
void print(struct LNode *head,char a) //链表打印函数
{ struct LNode *p;
p=head;
printf("%c = ( ",a);
while( p )
{ printf("%d ",p-data);
p=p-next;
}
puts(" )\n");
}
struct LNode *DeleteC_Linklist( struct LNode *L )//删除链表重复数
{ int key,had;
struct LNode *h,*p,*r,*q;
for(p=L;p-next!=NULL;p=p-next)
{ had = p-data;
for(r=p,q=p-next;q!=NULL;)
{ key = q-data;
if( key==had )
{ r-next=q-next; h=q;
q=q-next; free( h );
}
else
{ q=q-next; r=r-next;
}
}
}
return L;
}
void main () //主函数
{ struct LNode *L1,*L2,*L3;
char a='A',b='B',c='C',d='D';
L1 = creat(); //创建链表L1
Rand(L1); //对L1排序
puts("\n创建的链表经排序后为:");
print(L1,a);
L2 = creat(); //创建链表L2
Rand(L2); //对L2排序
puts("\n创建的链表经排序后为:");
print(L2,b);
L3=Merger_Linklist( L1,L2 ); //合并链表L1和L2
Rand(L3); //对合并后的链表排序
puts("合并后的链表为:");
print(L3,c);
DeleteC_Linklist( L3 );
printf("删除重复数后的链表为:\n");
print(L3,d); //打印删除后的链表
}
#include "stdio.h"
void paixu(int *p,int n)
{
int i,j,tmp;
for(i = 0; i n; i++)
{
for (j = n - 1; j i; j--)
if (p[j] p[j-1])
{
tmp = p[j-1];
p[j-1] = p[j];
p[j] = tmp;
}
}
}
main()
{
int i;
int number[10] = {95, 45, 15, 78, 84, 51, 24, 12,1,2};
paixu(number,10);
for (i = 0; i 10; i++)
{
printf("%d ", number[i]);
}
printf("\n");
//getch();
}
都搞好了。
#includestdio.h
#includestdlib.h
#includestring.h
#define LEN 30 /* 学号和姓名最大字符数,实际请更改 */
#define N 200 /* 最大学生人数,实际请更改*/
struct record
{
char code[LEN+1]; /* 学号 */
char name[LEN+1]; /* 姓名 */
int age;
char sex[3];
char time[LEN+1];
char add[LEN+1];
char tel[LEN+1];
char mail[LEN+1];
}stu[N];
int k=1,n,m;
int order[N];
void readfile();/* 函数声明 */
void sort();
void seek();
void modify();
void insert();
void del();
void display();
void save();
void menu();
int main()
{
while(k)
menu();
system("pause");
return 0;
}
void readfile()/* 建立信息 */
{
char *p="student.dat";
FILE *fp;
int i=0;
if ((fp=fopen("student.dat","r"))==NULL) /* 把此程序和文件student.dat放在同一目录下 */
{ printf("Open file %s error! Strike any key to exit!",p);
system("pause");
exit(0);
}
while(fscanf(fp,"%s %s%d%s %s %s %s %s",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail)==8)
{
i++;
order[i]=i;
}
fclose(fp);
n=i;
printf("录入完毕!\n");
}
void seek()
{int i,j,item,flag;
char s1[LEN+1]; /* 以姓名和学号最长长度+1为准 */
printf("------------------\n");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
printf("3.退出本菜单\n");
printf("------------------\n");
while(1)
{ printf("请选择子菜单编号:");
scanf("%d",item);
flag=0;
switch(item)
{
case 1:
printf("请输入要查询的学生的学号:\n");
scanf("%s",s1);
for(i=0;in;i++)
if(strcmp(stu[i].code,s1)==0)
{ flag=1;
printf("该学生学号,姓名,年龄,性别,出生年月,地址,电话,E-mail 分别为:\n");
printf("%s %s %d %s %s %s %s %s\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
if(flag==0)
printf("该学号不存在!\n"); break;
case 2:
printf("请输入要查询的学生的姓名:\n");
scanf("%s",s1);
for(i=0;in;i++)
if(strcmp(stu[i].name,s1)==0)
{ flag=1;
printf("该学生学号,姓名,年龄,性别,出生年月,地址,电话,E-mail 分别为:\n");
printf("%s %s %d %s %s %s %s %s\n",stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
if(flag==0)
printf("该姓名不存在!\n"); break;
case 3:return;
default:printf("请在1-3之间选择\n");
}
}
}
void sort() /*选择排序*/
{
int i,j,k,t;
for(i=0;in-1;i++)/*共扫视n-1遍*/
{
k=i;
for(j=i+1;jn;j++)
if(strcmp(stu[order[i]].code,stu[order[j]].code)0)
k=j;
if(k!=i)
{/*交换名次*/
t=order[i];
order[i]=order[k];
order[k]=t;
}
}
printf("通讯录资料按人名号码从低到高为:\n");
for(i=0;in;i++)
{
printf("%s %s %d %s %s %s %s %s\n",stu[order[i]].code,stu[order[i]].name,stu[order[i]].age,
stu[order[i]].sex,stu[order[i]].time,stu[order[i]].add,stu[order[i]].tel,stu[order[i]].mail);
}
}
void modify() /*修改信息*/
{int i,j,item,num;
char sex1[3],s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准 */
printf("请输入要要修改的学生的学号:\n");
scanf("%s",s1);
for(i=0;in;i++)
if(strcmp(stu[i].code,s1)==0)
num=i;
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改出生年月\n");
printf("5.修改地址\n");
printf("6.修改电话号码\n");
printf("7.修改E-mail地址\n");
printf("8.退出本菜单\n");
printf("------------------\n");
while(1)
{ printf("请选择子菜单编号:");
scanf("%d",item);
switch(item)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s",s2);
strcpy(stu[num].name,s2); break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d",stu[num].age);break;
case 3:
printf("请输入新的性别:\n");
scanf("%s",sex1);
strcpy(stu[num].sex,sex1); break;
case 4:
printf("请输入新的出生年月:\n");
scanf("%s",s2);
strcpy(stu[num].time,s2); break;
case 5:
printf("请输入新的地址:\n");
scanf("%s",s2);
strcpy(stu[num].add,s2); break;
case 6:
printf("请输入新的电话号码:\n");
scanf("%s",s2);
strcpy(stu[num].tel,s2); break;
case 7:
printf("请输入新的E-mail地址:\n");
scanf("%s",s2);
strcpy(stu[num].mail,s2); break;
case 8:return;
default:printf("请在1-8之间选择\n");
}
}
}
void insert()
{ int i=n,j,flag;
printf("请输入待增加的学生数:\n");
scanf("%d",m);
do
{ flag=1;
while(flag)
{ flag=0;
printf("请输入第 %d 个学生的学号:\n",i+1);
scanf("%s",stu[i].code);
for(j=0;ji;j++)
if(strcmp(stu[i].code,stu[j].code)==0)
{ printf("已有该学号,请检查后重新录入!\n");
flag=1;
break; /*如有重复立即退出该层循环,提高判断速度*/
}
}
printf("请输入第 %d 个学生的姓名:\n",i+1);
scanf("%s",stu[i].name);
printf("请输入第 %d 个学生的年龄:\n",i+1);
scanf("%d",stu[i].age);
printf("请输入第 %d 个学生的性别:\n",i+1);
scanf("%s",stu[i].sex);
printf("请输入第 %d 个学生的出生年月:(格式:年.月)\n",i+1);
scanf("%s",stu[i].time);
printf("请输入第 %d 个学生的地址:\n",i+1);
scanf("%s",stu[i].add);
printf("请输入第 %d 个学生的电话:\n",i+1);
scanf("%s",stu[i].tel);
printf("请输入第 %d 个学生的E-mail:\n",i+1);
scanf("%s",stu[i].mail);
if(flag==0)
{
order[i]=i;
i++;
}
}while(in+m);
n+=m;
printf("录入完毕!\n\n");
}
void del()
{ int i,j,k,flag=0;
char s1[LEN+1];
printf("请输入要删除学生的学号:\n");
scanf("%s",s1);
for(i=0;in;i++)
if(strcmp(stu[order[i]].code,s1)==0)
{ flag=1;
for(j=i;jn-1;j++)
stu[order[j]]=stu[order[j+1]];
}
if(flag==0)
printf("该学号不存在!\n");
if(flag==1)
{ printf("删除成功,显示结果请选择菜单6\n");
n--;
}
}
void display()
{ int i,j;
printf("所有学生的信息为:\n");
for(i=0;in;i++)
{
printf("%s %s %d %s %s %s %s %s\n",stu[order[i]].code,stu[order[i]].name,stu[order[i]].age,
stu[order[i]].sex,stu[order[i]].time,stu[order[i]].add,stu[order[i]].tel,stu[order[i]].mail);
}
}
void save()
{ int i;
FILE *fp;
fp=fopen("student.dat","w");
for(i=0;in;i++)
{ fprintf(fp,"%s %s %d %s %s %s %s %s\n",stu[order[i]].code,stu[order[i]].name,stu[order[i]].age,
stu[order[i]].sex,stu[order[i]].time,stu[order[i]].add,stu[order[i]].tel,stu[order[i]].mail);
}
fclose(fp);
}
void menu()/* 界面 */
{ int num;
printf(" \n\n简易学生通讯录系统\n\n");
printf("*****系统功能菜单*****\n");
printf("----------------------\n");
printf("1.读入学生信息\n");
printf("2.查询学生信息\n");
printf("3.修改学生信息\n");
printf("4.增加学生信息\n");
printf("5.按学号删除信息\n");
printf("6.显示当前信息\n");
printf("7.保存当前学生信息(要把修改保存到文件,退出程序前必须执行本项)\n");
printf("8.按学号从低到高排序\n");
printf("9.退出系统\n");
printf("----------------------\n");
printf("请选择菜单编号:");
scanf("%d",num);
switch(num)
{
case 1:readfile();break;/*在主函数中调用子函数时,子函数不要带上类型,这和声明子函数不同*/
case 2:seek();break;
case 3:modify();break;
case 4:insert();break;
case 5:del();break;
case 6:display();break;
case 7:save();break;
case 8:sort();break;
case 9:k=0;break;
default:printf("请在1-9之间选择\n");
}
}