生活随笔
收集整理的這篇文章主要介紹了
C语言实用算法系列之学生管理系统_单向链表内操作_选择排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單向鏈表實現
#include <stdio.h>
#include <malloc.h>typedef int DATA
;struct SNode
{DATA data
;SNode
* pNext
;
};
SNode
* g_pHead
= NULL;void AddHead(DATA data
)
{SNode
* p
= (SNode
*)malloc(sizeof(SNode
));p
->data
= data
;p
->pNext
= g_pHead
;g_pHead
= p
;
}void AddTail(DATA data
)
{SNode
* pNew
= (SNode
*)malloc(sizeof(SNode
));pNew
->data
= data
;pNew
->pNext
= NULL;if (!g_pHead
){g_pHead
= pNew
;return;}SNode
* p
= g_pHead
;while (p
->pNext
)p
= p
->pNext
;p
-> pNext
= pNew
;
}void Print()
{SNode
* p
= g_pHead
;while (p
){printf("%d ", p
->data
);p
= p
->pNext
;}
}int main()
{AddHead(3);AddHead(2);AddHead(1);return 0;
}
學生管理系統_單向鏈表內操作
- 只實現了按學號排序SortByNumb函數,按姓名、數學成績排序實現類似,可參考前序文章,不做贅述。
- 單向鏈表內操作,意思是排序時對鏈表內部數據直接進行排序,會改變鏈表內容。
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#include <stdlib.h>typedef struct SUser
{int nNumb
;char sName
[20];float fMath
;
}DATA
;struct SNode
{DATA data
;SNode
* pNext
;
};SNode
* g_pHead
= NULL;void AddTail(DATA data
)
{SNode
* pNew
= (SNode
*)malloc(sizeof(SNode
));pNew
->data
= data
;pNew
->pNext
= NULL;if (!g_pHead
){g_pHead
= pNew
;return;}SNode
* p
= g_pHead
;while (p
->pNext
)p
= p
->pNext
;p
->pNext
= pNew
;
}void AddHead(DATA data
)
{SNode
* p
= (SNode
*)malloc(sizeof(SNode
));p
->data
= data
;p
->pNext
= g_pHead
;g_pHead
= p
;
}void Load()
{DATA data
;FILE
* pf
= fopen("stud.lv", "r");if (!pf
){puts("加載信息時失敗!");return;}while (fread(&data
, 1, sizeof(DATA
), pf
) == sizeof(DATA
)){AddTail(data
);}fclose(pf
);
}void Save()
{SNode
* p
= g_pHead
;FILE
* pf
= fopen("stud.lv", "w");if (!pf
){puts("保存文件時失敗!");return;}while (p
){fwrite(p
, 1, sizeof(p
->data
), pf
);p
= p
->pNext
;}fclose(pf
);
}void Print()
{system("cls");puts("學號\t姓名\t成績");int i
= 0;SNode
* p
= g_pHead
;while (p
){printf("%d\t%s\t%0.1f\n", p
->data
.nNumb
,p
->data
.sName
,p
->data
.fMath
);p
= p
->pNext
;++i
;}printf("\t總共有 %d 條記錄\n", i
);system("pause");
}void Input(int nDir
)
{int nNumb
;printf("請輸入學號:");scanf_s("%d", &nNumb
);DATA data
;data
.nNumb
= nNumb
;printf("請輸入姓名:");scanf_s("%s", data
.sName
, sizeof(data
.sName
));printf("請輸入成績:");scanf_s("%f", &data
.fMath
);if (1 == nDir
)AddHead(data
);elseAddTail(data
);Save();Print();
}int AddMenu()
{puts("1.向頭部插入");puts("2.向尾部插入");puts("0.返回主菜單");int i
= 0;scanf_s("%d", &i
);switch (i
){case 1:case 2:Input(i
);break;}return i
;
}void SortByNumb()
{SNode
* p
= g_pHead
;if (!p
)return;while (p
->pNext
){SNode
* q
= p
->pNext
;SNode
* m
= p
;while (q
){if (q
->data
.nNumb
< m
->data
.nNumb
)m
= q
;q
= q
->pNext
;}if (m
!= p
){DATA t
= p
->data
;p
->data
= m
->data
;m
->data
= t
;}p
= p
->pNext
;}
}int SortMenu()
{system("cls");puts("1.按學號排序");puts("2.按姓名排序");puts("3.按成績排序");puts("0.返回主菜單");int i
= 0;scanf_s("%d", &i
);switch (i
){case 1:SortByNumb();break;case 2:break;case 3:break;default:return i
;}Print();return i
;
}int Menu()
{int i
= 0;system("cls");puts("1.瀏覽所有信息");puts("2.添加信息");puts("3.刪除信息");puts("4.修改信息");puts("5.查找信息");puts("6.顏色設置");puts("0.退出");printf("請選擇:");scanf_s("%d", &i
);switch (i
){case 0:break;case 1:while (SortMenu());break;case 2:while (AddMenu());break;}return i
;
}int main()
{Load();while (Menu());return 0;
}
總結
以上是生活随笔為你收集整理的C语言实用算法系列之学生管理系统_单向链表内操作_选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。