您的位置:首页 > 其它

学生信息管理系统C实现

2010-09-09 21:23 543 查看
最近看了一些数据结构的书,感觉看书的时候看一段时间就感到厌倦了,个人觉得光看书枯燥无味而且也没多大收获,倒不如丢开书本自己写代码,遇到不会的再看书或请教别人,于是决定写一些代码,也算是我学了数据结构的劳动成果吧。代码不多,1000行左右。其中有些代码是照搬别人的,但85%以上的代码还是我个人写的,说实话,写这些代码确实觉得很累,为了完成这段代码,请教了不少CSDN的网友,今天我就把代码贴出来,代码我也不想修改了,注释也没写多少,毕竟个人能力有限,再说这些代码也没多大实际意义,希望对于那些初学数据结构的朋友们能有所帮助,也希望高手能指点一二。

好了,废话也不多说了,直接把代码贴出来算了。这是一个小的不能再小的学生信息管理系统。



该系统的主要功能图

/*

* studamdin.c

*

* Created on: 2010-5-18

* Author: Richard

*/

#include <stdlib.h>

#include <stdio.h>

#include <ctype.h>

#include <string.h>


typedef struct student *stud;

struct student {

char num[20]; //学号

char name[20]; //姓名

int age; //年龄

int score; //分数

char pnum[20]; //电话号码

stud next;

};


char *getnum(); //获得学生学号并判断其合法性

char *getname(); //获得学生姓名并判断其合法性

int getage(); //获得学生年龄并判断其合法性

int getscore(); //获得学生分数并判断其合法性

char *getpnum(); //获得学生电话号码并判断其合法性

void StudInit(stud *head); //链表初始化

void InsertAtHead(stud head, stud p0); //头插法

void InsertAtMid(stud head, stud p0, int(*compare)(stud, stud)); //中间插法

void InsertAtTail(stud head, stud p0); //尾插法

void InsertAtPos(stud head, int i, stud p0); //插在指定位置

void Insert(stud head); //向链表中插入记录

int Length(stud head); //获得链表长度

void keyboard(stud head); //通过键盘录入记录

void file(stud head); //通过文件录入记录

void input(stud head); //录入记录

int SearchByMember(stud head, stud p0, int(*compare)(stud, stud));//通过结构体成员查找

stud SearchByPos(stud head, int i); //通过位置查找

void Search(stud head); //查找记录

void DeleteByPos(stud head, int i); //通过位置删除

void DeleteByMember(stud head, stud p0, int(*compare)(stud, stud)); //通过结构体成员删除

void DeleteDuplicate(stud head, int(*compare)(stud, stud)); //删除重复记录

void DeleteAll(stud head); //删除所有记录

void Delete(stud head); //删除记录

void Viewall(stud head); //输出链表

void Reverse(stud head); //反向输出链表

void Savetofile(stud head); //输出链表到文件

void Output(stud head); //输出链表

int Cmpnum(stud p1, stud p2); //比较学号

int Cmpname(stud p1, stud p2); //比较姓名

int Cmpage(stud p1, stud p2); //比较年龄

int Cmpscore(stud p1, stud p2); //比较成绩

int Cmppnum(stud p1, stud p2); //比较电话号码

void InsertionSortLink(stud *ListHead, stud ListEnd, int(*compare)(stud, stud)); //插入排序

void

xQuickSortL(stud *ListHead, stud ListEnd, int N, int(*compare)(stud, stud)); //随机快速排序

void Sort(stud head); //排序

stud Getonerec(stud head); //获得一条记录

stud Getonenode(); //产生一个结点


int Cmpnum(stud p1, stud p2) {

return strcmp(p1->num, p2->num);

}


int Cmpname(stud p1, stud p2) {

return strcmp(p1->name, p2->name);

}


int Cmpage(stud p1, stud p2) {

return p1->age - p2->age;

}


int Cmpscore(stud p1, stud p2) {

return p1->score - p2->score;

}


int Cmppnum(stud p1, stud p2) {

return strcmp(p1->pnum, p2->pnum);

}


char *getnum() {

char *number = malloc(20), *head = "071080", *p;

memset(number, '/0', 20);

while (1) {

printf("请输入学生学号,必须以071080开头,长度为8,全为数字,输入0结束/n");

scanf("%s", number);

if (strcmp(number, "0") == 0)

break;

if (strlen(number) == 8 && strncmp(number, head, 6) == 0) {

for (p = number; *p != '/0' && isdigit(*p); p++)

;

if (*p == '/0')

break;

}

printf("输入不合法!请重试!/n");

}

return number;

}


char *getname() {

char *name = malloc(20), *p;

memset(name, '/0', 20);

while (1) {

printf("请输入学生姓名,必须全为字母,长度为1~20/n");

scanf("%s", name);

//getchar();

for (p = name; *p != '/0' && isprint(*p) && !iscntrl(*p)

&& !isdigit(*p); p++)

;

if (*p == '/0')

break;

printf("输入不合法!请重试!/n");

}

return name;

}


int getage() {

char *sage = malloc(20), *p;

int age;

memset(sage, '/0', 20);

while (1) {

printf("请输入学生年龄,必须为1~100之间的整数/n");

scanf("%s", sage);

//getchar();

for (p = sage; *p != '/0' && isdigit(*p); p++)

;

if (*p == '/0') {

age = atoi(sage);

if (age > 0 && age <= 100)

break;

}

printf("输入不合法,请重试!/n");

}

return age;

}


int getscore() {

int score;

char *sscore = malloc(20), *p;

memset(sscore, '/0', 20);

while (1) {

printf("请输入学生成绩,必须为0~100的整数/n");

scanf("%s", sscore);

//getchar();

for (p = sscore; *p != '/0' && isdigit(*p); p++)

;

if (*p == '/0') {

score = atoi(sscore);

if (score >= 0 && score <= 100)

break;

}

printf("输入不合法,请重试!/n");

}

return score;

}


char *getpnum() {

char *number = malloc(20), *p;

memset(number, '/0', 20);

while (1) {

printf("请输入电话号码,必须全为数字,长度为11/n");

scanf("%s", number);

//getchar();

if (strlen(number) == 11) {

for (p = number; *p != '/0' && isdigit(*p); p++)

;

if (*p == '/0')

break;

}

printf("输入不合法,请重试!/n");

}

return number;

}


void StudInit(stud *head) {

if ((*head = (stud) malloc(sizeof(struct student))) == NULL) {

printf("分配内存出错!/n");

exit(-1);

}

(*head)->next = NULL;

}


int Length(stud head) {

if (head->next == NULL)

return 0;

else {

int i = 0;

stud p = head->next;

while (p) {

i++;

p = p->next;

}

return i;

}

}


void InsertAtHead(stud head, stud p0) {

p0->next = head->next;

head->next = p0;

}


void InsertAtTail(stud head, stud p0) {

if (head->next == NULL)

InsertAtHead(head, p0);

else {

stud p = head->next;

while (p->next != NULL)

p = p->next;

p0->next = p->next;

p->next = p0;

}

}


void InsertAtMid(stud head, stud p0, int(*compare)(stud, stud)) {

if (head->next == NULL)

InsertAtHead(head, p0);

else {

stud p = head->next, p1 = head;

while ((*compare)(p0, p) > 0 && p->next != NULL) {

p1 = p;

p = p->next;

}

if (p->next == NULL)

InsertAtTail(head, p0);

else if (p1 == head)

InsertAtHead(head, p0);

else {

p0->next = p1->next;

p1->next = p0;

}

}

}


void InsertAtPos(stud head, int i, stud p0) {

int j;

stud p = head;

if (i == Length(head) + 1) {

InsertAtTail(head, p0);

} else if (i == 1) {

InsertAtHead(head, p0);

} else {

for (j = 1; j <= i - 1; j++)

p = p->next;

p0->next = p->next;

p->next = p0;

}

}


void Insert(stud head) {

int i, j;

stud p0;

while (1) {

printf("/t/t/t插入记录/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("请选择(1~9)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtHead(head, p0);

printf("成功插入该记录!/n");

}

break;

case 2:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtTail(head, p0);

printf("成功插入该记录!/n");

}

break;

case 3:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtMid(head, p0, Cmpnum);

printf("成功插入该记录!/n");

}

break;

case 4:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtMid(head, p0, Cmpname);

printf("成功插入该记录!/n");

}

break;

case 5:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtMid(head, p0, Cmpage);

printf("成功插入该记录!/n");

}

break;

case 6:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtMid(head, p0, Cmpscore);

printf("成功插入该记录!/n");

}

break;

case 7:

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtMid(head, p0, Cmppnum);

printf("成功插入该记录!/n");

}

break;

case 8:

printf("请输入要插入的位置/n");

scanf("%d", &j);

getchar();

if (j < 1 || j > Length(head) + 1)

printf("插入位置不合法!/n");

else {

p0 = Getonerec(head);

if (p0 == NULL)

printf("你输入了不合法的记录!/n");

else {

InsertAtPos(head, j, p0);

printf("成功插入该记录!/n");

}

}

break;

case 9:

return;

break;

default:

printf("输入不合法,请重试!/n");

}

}

}


void keyboard(stud head) {

char *num, *name, *pnum;

int age, score;

stud p0, p = Getonenode();

while (1) {

num = getnum();

strcpy(p->num, num);

if (strcmp(num, "0") == 0 || SearchByMember(head, p, Cmpnum)) {

printf("学号为0或该学号已存在!已有记录如上!/n");

return;

}

pnum = getpnum();

strcpy(p->pnum, pnum);

if (SearchByMember(head, p, Cmppnum)) {

printf("该电话号码已存在!已有记录如上!/n");

return;

} else {

name = getname();

age = getage();

score = getscore();

p0 = (stud) malloc(sizeof *p0);

strcpy(p0->num, num);

strcpy(p0->name, name);

p0->age = age;

p0->score = score;

strcpy(p0->pnum, pnum);

InsertAtTail(head, p0);

}

}

}


stud Getonenode() {

stud p = malloc(sizeof *p);

memset(p->name, '/0', 20);

memset(p->num, '/0', 20);

memset(p->pnum, '/0', 20);

p->age = 0;

p->score = 0;

p->next = NULL;

return p;

}


stud Getonerec(stud head) {

printf("输入一条记录/n");

char *num, *name, *pnum;

int age, score;

stud p0, p = Getonenode();

num = getnum();

strcpy(p->num, num);

if (strcmp(num, "0") == 0 || SearchByMember(head, p, Cmpnum)) {

printf("学号为0或该学号已存在!已有记录如上:/n");

return NULL;

}

pnum = getpnum();

strcpy(p->pnum, pnum);

if (SearchByMember(head, p, Cmppnum)) {

printf("该电话号码已存在!已有记录如上:/n");

return NULL;

} else {

name = getname();

age = getage();

score = getscore();

p0 = (stud) malloc(sizeof *p0);

strcpy(p0->num, num);

strcpy(p0->name, name);

p0->age = age;

p0->score = score;

strcpy(p0->pnum, pnum);

}

return p0;

}


void file(stud head) {

FILE *fp;

char filepath[20];

stud p, p0 = Getonenode();

char *num = malloc(20), *name = malloc(20), *pnum = malloc(20);

int score, age;

printf("请输入文件路径名:/n");

scanf("%s", filepath);

//getchar();

if ((fp = fopen(filepath, "r")) == NULL) {

printf("不能找到该文件:%s/n", filepath);

return;

}

printf("以下记录为重复记录:/n");

while (fscanf(fp, "%s %s %d %d %s", num, name, &age, &score, pnum) != EOF) {

strcpy(p0->num, num);

strcpy(p0->pnum, pnum);

if (strcmp(num, "0") != 0 && !SearchByMember(head, p0, Cmpnum)

&& !SearchByMember(head, p0, Cmppnum)) {

p = (stud) malloc(sizeof(*p));

strcpy(p->num, num);

strcpy(p->name, name);

strcpy(p->pnum, pnum);

p->score = score;

p->age = age;

InsertAtTail(head, p);

}

}

fclose(fp);

printf("成功录入记录!/n");

}


void input(stud head) {

int i;

while (1) {

printf("/t/t/t录入记录/n");

printf("1.从键盘录入/n");

printf("2.从文件录入/n");

printf("3.返回主菜单/n");

printf("请选择(1~3)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

keyboard(head);

break;

case 2:

file(head);

break;

case 3:

return;

break;

default:

printf("输入不合法,请重试!");

}

}

}


int SearchByMember(stud head, stud p0, int(*compare)(stud, stud)) {

if (head->next == NULL)

return 0;

stud p = head->next;

int i = 0;

for (; p; p = p->next)

if ((*compare)(p, p0) == 0) {

printf("%s/t%s/t%d/t%d/t%s/n", p->num, p->name, p->age, p->score,

p->pnum);

i++;

}

return i;

}


stud SearchByPos(stud head, int i) {

if (head->next == NULL)

return NULL;

if (i < 1 && i > Length(head))

return NULL;

int j;

stud p = head;

for (j = 1; p && j <= i; j++)

p = p->next;

return p;

}


void Search(stud head) {

int i, j, age, score;

char *num, *name, *pnum;

stud p, p0 = Getonenode();

while (1) {

printf("/t/t查找指定记录/n");

printf("1.根据学号查找/n");

printf("2.根据姓名查找/n");

printf("3.根据年龄查找/n");

printf("4.根据成绩查找/n");

printf("5.根据电话号码查找/n");

printf("6.根据位置查找/n");

printf("7.返回主菜单/n");

printf("请选择(1~7)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

num = getnum();

strcpy(p0->num, num);

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

j = SearchByMember(head, p0, Cmpnum);

if (j == 0)

printf("没有相关记录!/n");

else

printf("一共有%d条相关记录!/n", j);

break;

case 2:

name = getname();

strcpy(p0->name, name);

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

j = SearchByMember(head, p0, Cmpname);

if (j == 0)

printf("没有相关记录!/n");

else

printf("一共有%d条相关记录!/n", j);

break;

case 3:

age = getage();

p0->age = age;

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

j = SearchByMember(head, p0, Cmpage);

if (j == 0)

printf("没有相关记录!/n");

else

printf("一共有%d条相关记录!/n", j);

break;

case 4:

score = getscore();

p0->score = score;

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

j = SearchByMember(head, p0, Cmpscore);

if (j == 0)

printf("没有相关记录!/n");

else

printf("一共有%d条相关记录!/n", j);

break;

case 5:

pnum = getpnum();

strcpy(p0->pnum, pnum);

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

j = SearchByMember(head, p0, Cmppnum);

if (j == 0)

printf("没有相关记录!/n");

else

printf("一共有%d条相关记录!/n", j);

break;

case 6:

printf("请输入位置/n");

scanf("%d", &j);

getchar();

p = SearchByPos(head, j);

if (p) {

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

printf("%s/t%s/t%d/t%d/t%s/n", p->num, p->name, p->age,

p->score, p->pnum);

} else {

printf("没有相关记录/n");

}

break;

case 7:

return;

break;

default:

printf("输入不合法,请重试!/n");

}

}

}


void DeleteByPos(stud head, int i) {

if (SearchByPos(head, i) == NULL) {

printf("没有该记录!");

return;

} else {

stud p = head->next, p1 = head, p0 = SearchByPos(head, i);

while (p != p0) {

p1 = p;

p = p->next;

}

p1->next = p->next;

free(p);

printf("成功删除该记录!/n");

}

}


void DeleteByMember(stud head, stud p0, int(*compare)(stud, stud)) {

if (head->next == NULL || SearchByMember(head, p0, *compare) == 0) {

printf("没有该记录,无法删除!/n");

return;

} else {

stud p, q = head, t;

for (p = head->next; p != NULL; p = t) {

t = p->next;

if ((*compare)(p, p0) == 0) {

q->next = p->next;

free(p);

} else

q = p;

}

printf("成功删除记录以上记录!/n");

}

}


void DeleteDuplicate(stud head, int(*compare)(stud, stud)) {

stud p, q, r, t;

p = head->next;

while (p) {

r = p->next;

q = p;

for (; r; r = t) {

t = r->next;

if ((*compare)(p, r) == 0) {

q->next = r->next;

free(r);

} else

q = r;

}

p = p->next;

}

}


void DeleteAll(stud head) {

if (head->next == NULL) {

printf("没有记录,无法删除!/n");

return;

} else {

stud p, p1;

for (p = head->next; p; p = p1) {

p1 = p->next;

free(p);

}

printf("成功删除所有记录!/n");

}

}


void Delete(stud head) {

int i, j;

char *num, *pnum, *name;

int age, score;

stud p0 = Getonenode();

while (1) {

printf("/t/t/t删除指定记录/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("10.删除所有记录/n");

printf("11.返回主菜单/n");

printf("请选择(1~11)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

num = getnum();

strcpy(p0->num, num);

DeleteByMember(head, p0, Cmpnum);

break;

case 2:

pnum = getpnum();

strcpy(p0->pnum, pnum);

DeleteByMember(head, p0, Cmppnum);

break;

case 3:

printf("请输入位置/n");

scanf("%d", &j);

getchar();

DeleteByPos(head, j);

break;

case 4:

name = getname();

strcpy(p0->name, name);

DeleteByMember(head, p0, Cmpname);

break;

case 5:

age = getage();

p0->age = age;

DeleteByMember(head, p0, Cmpage);

break;

case 6:

score = getscore();

p0->score = score;

DeleteByMember(head, p0, Cmpscore);

printf("成功删除记录!/n");

break;

case 7:

DeleteDuplicate(head, Cmpname);

printf("成功删除重复记录!/n");

break;

case 8:

DeleteDuplicate(head, Cmpage);

printf("成功删除重复记录!/n");

break;

case 9:

DeleteDuplicate(head, Cmpscore);

printf("成功删除重复记录!/n");

break;

case 10:

DeleteAll(head);

break;

case 11:

return;

break;

default:

printf("输入不合法,请重试!/n");

}

}

}


void Viewall(stud head) {

if (head->next == NULL) {

printf("没有记录!/n");

return;

} else {

stud p;

printf("学生学号/t学生姓名/t学生年龄/t学生成绩/t电话号码/n");

for (p = head->next; p; p = p->next)

printf("%s/t%s/t%d/t%d/t%s/n", p->num, p->name, p->age, p->score,

p->pnum);

}

}


void Reverse(stud head) {

if (head == NULL)

return;

stud p1, p2;

p1 = head->next;

head->next = NULL;

while (p1) {

p2 = p1->next;

p1->next = head->next;

head->next = p1;

p1 = p2;

}

}


void Savetofile(stud head) {

if (head->next == NULL) {

printf("记录为空!/n");

return;

} else {

FILE *fp;

stud p = head->next;

char filepath[20];

printf("请输入文件路径名:/n");

scanf("%s", filepath);

//getchar();

if ((fp = fopen(filepath, "w+")) == NULL) {

printf("不能打开文件%s!/n", filepath);

return;

} else {

while (p) {

fprintf(fp, "%s %s %d %d %s/n", p->num, p->name, p->age,

p->score, p->pnum);

p = p->next;

}

fclose(fp);

}

}

}


void output(stud head) {

int i;

while (1) {

printf("/t/t/t输出记录及保存至文件/n");

printf("1.查看所有记录/n");

printf("2.反向查看所有记录/n");

printf("3.保存至文件/n");

printf("4.返回主菜单/n");

printf("请选择(1~4)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

Viewall(head);

break;

case 2:

Reverse(head);

Viewall(head);

break;

case 3:

Savetofile(head);

printf("成功保存该记录!/n");

break;

case 4:

return;

break;

default:

printf("输入不合法,请重新输入!/n");

}

}

}


void InsertionSortLink(stud *ListHead, stud ListEnd, int(*compare)(stud, stud)) {

stud newlist, walk, save;

newlist = ListEnd;

walk = *ListHead;

for (; walk != ListEnd; walk = save) {

stud *pnewlink;

for (pnewlink = &newlist; *pnewlink != ListEnd && (*compare)(walk,

*pnewlink) >= 0; pnewlink = &((*pnewlink)->next))

;

save = walk->next;

walk->next = *pnewlink;

*pnewlink = walk;

}

*ListHead = newlist;

}


void xQuickSortL(stud *ListHead, stud ListEnd, int N, int(*compare)(stud, stud)) {

int left_count, right_count, npivot;

stud *left_walk, pivot, old;

stud *right_walk, right;

while (N > 1) {

if (N <= 9) {

InsertionSortLink(ListHead, ListEnd, *compare);

break;

}

npivot = abs(rand()) % N;

if (npivot < 2 || npivot > N - 2)

npivot = 2;

old = *ListHead;

while (npivot--)

old = old->next;

pivot = old->next;

old->next = pivot->next;

left_walk = ListHead;

right_walk = &right;

left_count = right_count = 0;

for (old = *ListHead; old != ListEnd; old = old->next) {

if ((*compare)(old, pivot) < 0) {

left_count += 1;

*left_walk = old;

left_walk = &(old->next);

} else {

right_count += 1;

*right_walk = old;

right_walk = &(old->next);

}

}

*right_walk = ListEnd;

*left_walk = pivot;

pivot->next = right;

if (left_count > right_count) {

xQuickSortL(&(pivot->next), ListEnd, right_count, *compare);

ListEnd = pivot;

N = left_count;

} else {

xQuickSortL(ListHead, pivot, left_count, *compare);

ListHead = &(pivot->next);

N = right_count;

}

}

}


void Sort(stud head) {

if (head->next == NULL) {

printf("没有记录,无法排序!/n");

return;

} else if (head->next->next == NULL) {

printf("只有一条记录,无须排序!/n");

}

while (1) {

printf("/t/t/t记录排序/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("10.根据电话号码降序排序/n");

printf("11.返回主菜单/n");

printf("请选择(1~11)/n");

int N = Length(head), i;

stud p = head->next;

scanf("%d", &i);

getchar();

switch (i) {

case 1:

xQuickSortL(&p, NULL, N, Cmpnum);

head->next = p;

printf("排序后的结果为:/n");

Viewall(head);

break;

case 2:

xQuickSortL(&p, NULL, N, Cmpnum);

head->next = p;

Reverse(head);

printf("排序后的结果为:/n");

Viewall(head);

break;

case 3:

xQuickSortL(&p, NULL, N, Cmpname);

head->next = p;

printf("排序后的结果为:/n");

Viewall(head);

break;

case 4:

xQuickSortL(&p, NULL, N, Cmpname);

head->next = p;

Reverse(head);

printf("排序后的结果为:/n");

Viewall(head);

break;

case 5:

xQuickSortL(&p, NULL, N, Cmpage);

head->next = p;

printf("排序后的结果为:/n");

Viewall(head);

break;

case 6:

xQuickSortL(&p, NULL, N, Cmpage);

head->next = p;

Reverse(head);

printf("排序后的结果为:/n");

Viewall(head);

break;

case 7:

xQuickSortL(&p, NULL, N, Cmpscore);

head->next = p;

printf("排序后的结果为:/n");

Viewall(head);

break;

case 8:

xQuickSortL(&p, NULL, N, Cmpscore);

head->next = p;

Reverse(head);

printf("排序后的结果为:/n");

Viewall(head);

break;

case 9:

xQuickSortL(&p, NULL, N, Cmppnum);

head->next = p;

printf("排序后的结果为:/n");

Viewall(head);

break;

case 10:

xQuickSortL(&p, NULL, N, Cmppnum);

head->next = p;

Reverse(head);

printf("排序后的结果为:/n");

Viewall(head);

break;

case 11:

return;

break;

default:

printf("输入不合法,请重试!/n");

}

}

}


int main() {

stud head;

StudInit(&head);

int i;

while (1) {

printf("/t/t/t欢迎使用本人制作的学生信息管理系统/n");

printf("1.录入记录/n");

printf("2.插入记录/n");

printf("3.查找记录/n");

printf("4.删除记录/n");

printf("5.查看记录及保存/n");

printf("6.记录排序/n");

printf("7.退出/n");

printf("请选择(1~7)/n");

scanf("%d", &i);

getchar();

switch (i) {

case 1:

input(head);

break;

case 2:

Insert(head);

break;

case 3:

Search(head);

break;

case 4:

Delete(head);

break;

case 5:

output(head);

break;

case 6:

Sort(head);

break;

case 7:

return 0;

break;

default:

printf("输入不合法,请重试!/n");

}

}

return 0;

}



参考书籍

[1]
陈锐. 零基础学数据结构[M].
北京:机械工业出版社,2010
[2]
谭浩强. C程序设计(第三版)[M].
北京:清华大学出版社,2005
[3]
宋劲杉. Linux C编程一站式学习[M].
北京:电子工业出版社,2009
[4] [美]罗伯特 赛奇威克,
算法:C语言实现(第1~4部分)[M].
霍红卫译. 北京:机械工业出版社,2009
[5] [美]Andrew BinStock,John Rex.
程序员实用算法[M]. 陈宗斌译. 北京:机械工业出版社,2009
[6]
陈先在,张丽萍. Linux C函数实例速查手册[M].
北京:人民邮电出版社,2009
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: