1. 程式人生 > >連結串列的簡單應用(C語言)

連結串列的簡單應用(C語言)

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct List{
    char name[8];
    int number;
    char sex[2];
    struct List*pNext;
}NODE,*PNODE;
void menu(void);
PNODE insert_student();                    /*新增學生資訊*/
void search_student(PNODE pH);             /*查詢學生資訊*/
void delate_student(PNODE pHead); /*刪除學生資訊*/ void print_student_additon_order(PNODE); /*以新增順序輸出學生資訊*/ void print_student_number_order(PNODE); /*以學號輸出學生資訊*/ void save_to_file(PNODE); /*儲存資訊至檔案*/ void exit_system(void); /*退出程式*/ void read_from_file(void); /*從檔案讀取資訊*/
int len = 0; /*統計學生人數*/ int main(void) { char choice; PNODE pHead = NULL; PNODE q = NULL; while(1) { menu(); switch(choice - '0') { case 1:pHead = insert_student();break; case 2:search_student(pHead);break; case
3:delate_student(pHead);break; case 4:print_student_additon_order(pHead);break; case 5:print_student_number_order(pHead);break; case 6:save_to_file(pHead);break; case 7:read_from_file();break; case 8:exit_system();break; default: break; } getch(); scanf("%c",&choice); fflush(stdin); } return 0; } PNODE insert_student(void) { PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(pHead == NULL) exit(0); else { PNODE p = pHead; PNODE pTail = pHead; pTail->pNext = NULL; int count = 1,s; char c; while(1) { printf("請輸入第%d個人的資訊\n",len+1); printf("請輸入姓名\n"); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(pNew == NULL) exit(0); scanf("%s",pNew->name); fflush(stdin); printf("請輸入他的學號\n"); scanf("%d",&pNew->number); printf("請輸入他的性別(0 = 女,1 = 男)\n"); scanf("%d",&s); fflush(stdin); if(s == 1) strcpy(pNew->sex,"男"); else strcpy(pNew->sex,"女"); pTail->pNext = pNew; /*連結串列的尾插法*/ pNew->pNext = NULL; pTail = pNew; printf("continued ? (y or n)"); scanf("%c",&c); ++count; ++len; if(c == 'y' || c == 'Y') continue; else break; } return p; } } void menu(void) { puts("這是一個學生管理系統\n"); puts("1.新增學生\n"); puts("2.查詢學生資訊\n"); puts("3.刪除學生記錄\n"); puts("4.按新增順序列出記錄\n"); puts("5.按學號順序列出記錄\n"); puts("6.儲存至檔案\n"); puts("7.讀取檔案\n"); puts("8.退出\n"); puts("********************\n"); puts("請輸入功能序號\n"); } void print_student_additon_order(PNODE pH) { PNODE p = pH->pNext; while(p != NULL) { printf("%s\n",p->name); printf("%d\n",p->number); printf("%s\n",p->sex); p = p->pNext; } return; } void print_student_number_order(PNODE pH) { PNODE p,q; int i,j; for(i = 0,p = pH->pNext;i < len - 1;i++,p = p->pNext) { for(j = i+1,q = p->pNext;j<len;j++,q = q->pNext) { if(p->number > q->number) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); strcpy(pNew->name,p->name); pNew->number = p->number; strcpy(pNew->sex,p->sex); strcpy(p->name,q->name); p->number = q->number; strcpy(p->sex,q->sex); strcpy(q->name,pNew->name); q->number = pNew->number; strcpy(q->sex,pNew->sex); } } } print_student_additon_order(pH); return; } void search_student(PNODE pH) { PNODE p = pH->pNext; int type; char st[8]; int flag; printf("請輸入要查詢的形式\n"); printf("1.姓名\n"); printf("2.學號\n"); scanf("%d",&type); if(type == 1){ printf("請輸入要查詢學生的姓名\n"); scanf("%s",st);} else{ printf("請輸入要查詢學生的學號\n"); scanf("%d",&flag);} while(p!= NULL) { if(type == 1){ if(strcmp(p->name,st) == 0) break; else p = p->pNext; } else { if(p->number == flag) break; else p = p->pNext; } } if(p == NULL){ printf("沒有所查詢的任何資訊\n"); return;} printf("%s\n",p->name); printf("%d\n",p->number); printf("%s\n",p->sex); printf("任意鍵繼續...\n"); } void delate_student(PNODE pH) { PNODE p = pH->pNext; int type; char st[8]; int flag; printf("請輸入要查詢的形式\n"); printf("1.姓名\n"); printf("2.學號\n"); scanf("%d",&type); if(type == 1){ printf("請輸入要刪除學生的姓名\n"); scanf("%s",st);} else{ printf("請輸入要刪除學生的學號\n"); scanf("%d",&flag);} while(p->pNext!= NULL) { if(type == 1){ if(strcmp(p->pNext->name,st) == 0) { PNODE r = p->pNext; p->pNext = r->pNext; free(r); r = NULL; len--; } } else { if(p->pNext->number == flag) { PNODE q = p->pNext; p->pNext = q->pNext; free(q); q = NULL; len--; } } } if(p == NULL) { printf("沒有所查詢的任何資訊\n"); return; } else printf("成功刪除,任意鍵繼續....."); return; } void save_to_file(PNODE pH) { FILE*fp; char filename[20]; PNODE p = pH->pNext; printf("請輸入檔案完整路徑\n"); fflush(stdin); gets(filename); if((fp = fopen(filename,"wt")) == NULL) printf("檔案寫入失敗\n"); else { while(p!= NULL){ fprintf(fp,"%s,%d,%s",p->name,p->number,p->sex); p = p->pNext;} printf("檔案儲存成功,任意鍵繼續...\n"); getch(); fclose(fp); return; } } void exit_system(void) { printf("退出中.....\n"); system("pause"); exit(0); } void read_from_file(void) { FILE*fp; PNODE pHead,pNew; char filename[20]; int i = 0; printf("請輸入檔案完整路徑\n"); gets(filename); if((fp = fopen(filename,"rt")) == NULL) printf("檔案讀取失敗\n"); pHead = (PNODE)malloc(sizeof(NODE)); PNODE pTail = pHead; pTail->pNext = NULL; while(!feof(fp)) { pNew = (PNODE)malloc(sizeof(NODE)); /*存放讀取資訊*/ fflush(stdin); fscanf(fp,"%s,%d,%s",pNew->name,&pNew->number,pNew->sex); pTail->pNext = pNew; pTail = pNew; } printf("檔案已成功讀出,任意鍵繼續...\n"); getch(); fclose(fp); return; }