level 1
嘿思祺
楼主

#include"stdio.h"#include"stdlib.h"
#include"string.h"
#define MAX 10
typedef struct stuInfo{
char stuName[10]; /*学生姓名*/
int Age; /*年龄*/
}ElemType;
typedef struct node{
ElemType data;
struct node *next;
}ListNode, *ListNodePtr;
typedef ListNodePtr List, *ListPtr;
int List_Init(ListPtr L, ElemType elem[], int n){
/*创建单链表用于存储elem中的n个学生数据*/
int status = 1, i = n - 1;/*status表示链表创建状态,1为成功,0为失败*/
ListNodePtr p;
ListNodePtr q;
q = (ListNodePtr)malloc(sizeof(ListNode));
q->next = NULL;
while (i >= 0){
p = (ListNodePtr)malloc(sizeof(ListNode));
if (!q){ status = 0; break; }
p->data.Age = elem[i].Age;
strcpy_s(p->data.stuName, elem[i].stuName);
p->next = q->next;
q->next = p;
i = i - 1;
}
*L = q;
return status;
}
void List_Destroy(ListPtr L){
/*销毁单链表,释放链表空间。*/
ListNodePtr p;
while (*L){
p = (*L)->next;
free(*L);
}
}
int List_Insert(ListPtr L, int pos, ElemType elem[]){
/*在单链表的第pos位的结点前插入值为elem的数据元素*/
int result = 0;/*函数返回结果为插入状态,1为成功,0为失败*/
ListNodePtr p, s;
p = (*L)->next;
int i = 0;
/*先进行指针定位*/
while (p&&i<pos){
i++;
p = p->next;
}
if (p&&i == pos){
s = (ListNodePtr)malloc(sizeof(ListNode));
if (s){
/*开始插入结点*/
p->data.Age = elem[i].Age;
strcpy_s(p->data.stuName, elem[i].stuName);
s->next = p->next;
p->next = s;
result = 1;
}
}
return result;
}
int List_Remove(ListPtr L, int pos){
/*删除单链表中第pos个结点数据元素,返回值1为成功,0为失败*/
int result = 0;
ListNodePtr p, s;
p = (*L)->next;
int i = 0;
/*先进行指针定位*/
while (p&&i<pos){
i++;
p = p->next;
}
if (p&&i == pos){
s = p->next;
p->next = s->next;
free(p);
result = 1;
}
return result;
}
int List_Merge(ListPtr La, ListPtr Lb){
/*合并两个单链表,合并后的链表存储在链表La中,Lb清空,学生数据按年龄递减排列。*/
int result = 1;
ListNodePtr p, a, b;
a = (*La)->next;
b = (*Lb)->next;
if (!a&&!b){ result = 0; return result; }
if (a&&b) {
if (a->data.Age >= b->data.Age)
{
(*La)->next = a; a = a->next; (*La)->next->next = NULL;
}
else{ (*La)->next = b; b = b->next; (*La)->next->next = NULL; }
}
while (a && b){
if (a->data.Age >= b->data.Age){
p = a->next; a->next = (*La)->next; (*La)->next = a; a = p;
}
else { p = b->next; b->next = (*La)->next; (*La)->next = b; b = p; }
}
while (b) { p = b->next; b->next = (*La)->next; (*La)->next = b; b = p; }
while (a) { p = a->next; a->next = (*La)->next; (*La)->next = a; a = p; }
return result;
}
void List_Output(ListNodePtr L){
/*输出合并后的单链表元素*/
ListNodePtr p = L->next;
if (!p) { printf("对不起,由于单链表为空,打印失败!\n"); return; }
while (p){
printf("%d\t%s\n", p->data.Age, p->data.stuName); p = p->next;
}
}
stuInfo readStuInfo(FILE* fp)
{
stuInfo pStuInfo;
fscanf_s(fp, "%s", &pStuInfo.stuName);
fscanf_s(fp, "\t%d\n", &pStuInfo.Age);
return pStuInfo;
}
bool check_nullfile(char *fname)
{
FILE *fp;
fopen_s(&fp, fname,"r");
if (!fp){
printf("学生信息初始化文件不存在!\n请放到C盘根目录(C:\\stuInfoA.txt或C:\\stuInfoB.txt)\n");
fopen_s(&fp, fname, "w");
fclose(fp);
}
else{
int temp;
int res = fscanf_s(fp, "%d", &temp);
fclose(fp);
if (res <= 0)
return false;
else
return true;
}
}
void List_Info_init(ElemType elem[], char *fname, int Studentcnt){
/*read stuinfo from file*/
int i;
for (i = 0; i<MAX; ++i){
free(elem);
}
bool res = check_nullfile(fname);
FILE *fp;
fopen_s(&fp, fname, "r");
int j = 0;
while (res&&!feof(fp)){
elem[i] = readStuInfo(fp);
j++;
Studentcnt++;
}
fclose(fp);
}
void Bubble_Sort(ElemType elem[], int n){
/*冒泡排序将学生信息以年龄递增的顺序也就是按出生年月降序排列*/
int i, j, swap;
for (i = 1; i<n; i++){
swap = 0;
for (j = 1; j <= n - 1; j++){
if (elem[j].Age<elem[j + 1].Age){
elem[0].Age = elem[j + 1].Age; elem[j + 1].Age = elem[j].Age; elem[j].Age = elem[0].Age;
strcpy_s(elem[0].stuName, elem[j + 1].stuName);
strcpy_s(elem[j + 1].stuName, elem[j].stuName);
strcpy_s(elem[j].stuName, elem[0].stuName);
swap = 1;
}
}
if (swap == 0) break;
}
}
int main(void)/*主函数*/
{
char *fnameA = "C:\\stuInfoA.txt", *fnameB = "C:\\stuInfoB.txt";
char main_command, case_command;
int num1=0, num2=0, num=0, pos=0, result=0;
ListNodePtr La = NULL, Lb = NULL;
ElemType elem1[50 + 1] = { 0 }, elem2[50 + 1] = { 0 };
List_Info_init(elem1,fnameA, num1);/*读入学生信息,并分别存入单链表表La,Lb中*/
Bubble_Sort(elem1,num1);
List_Init(&La, elem1,num1);
List_Info_init(elem2,fnameB, num1);
Bubble_Sort(elem2, num2);
List_Init(&Lb, elem2, num2);
num = num1 + num2;
for (;;){
printf("\n********** 请选择将要进行的操作 *****************\n\n");
printf("********** a.对线性表A进行操作 *****************\n");
printf("********** b.对线性表B进行操作 *****************\n");
printf("********** c.对线性表A,B进行合并 *****************\n");
printf("********** 输入其他字符退出程序 *****************\n\n");
fflush(stdin);
printf("请输入您要进行的操作(a,b或c):");
scanf_s("%c", &main_command);
switch (main_command){
case 'a':case 'A':{
if (La == NULL) { printf("您好,线性表A已被删除!\n"); break; }
printf("\n******** 请选择将要进行的操作 ********\n\n");
printf("******** a.删除线性表A中的信息********\n");
printf("******** b.打印线性表A中的信息********\n");
printf("******** c.销毁线性表A ********\n\n");
printf("******** d.向线性表A中插入信息 ********\n");
fflush(stdin);
printf("请输入您要进行的操作(a,b或c):");
scanf_s("%c", &case_command);
switch (case_command){
case 'a':
case 'A':{
printf("请输入要删学生信息的序号:");
scanf_s("%d", &pos);
result = List_Remove(&La, pos);
if (result == 0) printf("对不起,学生信息删除失败!\n");
else { printf("您好,学生信息删除成功!\n"); }
break; }
case 'b':
case 'B':{
List_Output(La); break; }
case 'c':
case 'C':{List_Destroy(&La); printf("您好,线性表A删除成功!\n"); break; }
case 'd':
case 'D':{printf("请输入要插入学生信息的序号:");
scanf_s("%d", &pos);
result = List_Insert(&La, pos, elem1);
if (result == 0) printf("对不起,学生信息插入失败!\n");
else { printf("您好,学生信息插入成功!\n"); }break; }
default: {printf("对不起,您的输入有误!\n"); break; }
}
break; }
case 'b': case'B':{
if (Lb == NULL) { printf("对不起,线性表B已被删除!\n"); break; }
printf("\n******** 请选择将要进行的操作 ********\n\n");
printf("******** a.删除线性表B中的信息********\n");
printf("******** b.打印线性表B中的信息********\n");
printf("******** c.销毁线性表B ********\n\n");
fflush(stdin);
printf("请输入您要进行的操作(a,b或c):");
scanf_s("%c", &case_command);
switch (case_command){
case 'a':
case 'A':{
printf("请输入要删学生信息的序号:");
scanf_s("%d", &pos);
result = List_Remove(&Lb, pos);
if (result == 0) printf("对不起,学生信息删除失败!\n");
else { printf("您好,学生信息删除成功!\n"); }
break; }
case 'b':
case 'B':{List_Output(Lb); break; }
case 'c':
case 'C':{List_Destroy(&Lb); printf("您好,线性表B删除成功!\n"); break; }
case 'd':
case 'D':{printf("请输入要插入学生信息的序号:");
scanf_s("%d", &pos);
result = List_Insert(&La, pos, elem2);
if (result == 0) printf("对不起,学生信息插入失败!\n");
else { printf("您好,学生信息插入成功!\n"); }break; }
default: {printf("对不起,您的输入有误!\n"); break; }
break;
}
}
case 'c': case 'C':{
result = List_Merge(&La, &Lb);
if (result = 1){ printf("打印合并后的线性表如下:\n"); List_Output(La); }
else printf("对不起,由于两张线性表均为空,合并失败。");
return 0; break; }
default: {printf("谢谢您的使用。\n"); return 0; break; }
}
}
}