c语言完美演绎9-17

/* 范例:9-17 */

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <iomanip.h>

typedef struct node

{

char name11; /* 姓名最长10字符 */

int score; /* 成绩 */

struct node *next; /* 指向下一个节点 */

} Node_type;

char choose_menu(void);

Node_type *head; /* 链表开始地址 */

Node_type *tail; /* 链表结尾地址 */

Node_type *nowptr; /* 链表目前节点地址 */

Node_type *prev; /* 记录上一节点地址 */

Node_type *newptr; /* 新增节点地址 */

char str111;

void insert_mode(void);

void delete_mode(void);

void show_mode(void);

/* 新增模式 */

void insert_mode(void)

{

char yn='n';

yn='y';

while((tolower(yn)=='y'))

{

newptr = (Node_type *)malloc(sizeof(Node_type));

printf("\n请输入姓名: ");

gets(str1);

if(strlen(str1)>10)

{

str110='\0';

printf("姓名超过长度,已截去!\n\n");

}

strcpy(newptr->name,str1);

printf("请输入分数(0~100): ");

gets(str1);

newptr->score=atoi(str1);

while(1)

{

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

break;

printf("请重新输入(0~100):");

gets(str1);

newptr->score=atoi(str1);

}

nowptr=head;

if(head==NULL) /* 原先无数据 */

{

newptr->next=NULL;

head=newptr;

tail=newptr;

nowptr=newptr;

}

else

{

/* 插入第一笔前 */

if((newptr->score)>(head->score))

{

newptr->next=head;

head=newptr;

nowptr=newptr;

}

else /* 插到中间 */

{

while(nowptr->next!=NULL)

{

prev=nowptr;

nowptr=nowptr->next;

if((newptr->score)>(nowptr->score))

{

newptr->next=nowptr;

prev->next=newptr;

nowptr=newptr;

break;

}

}

/* 插到结尾 */

if(nowptr==tail && newptr->score<=nowptr->score)

{

nowptr->next=newptr;

newptr->next=NULL;

tail=newptr;

nowptr=newptr;

}

}

}

/* 注意此处千万别自作聪明 free 掉 newptr; */

printf("是否继续?(y/n)");

do

{

yn = getche();

}while(tolower(yn)!='y' && tolower(yn)!='n');

}

}

void delete_mode()

{

Node_type *clear;

char tmpName11="";

if(head==NULL) /* 无数据 */

{

printf("\n无数据可输出!\n");

tail=NULL;

return;

}

else

{

printf("\n请输入欲删除的姓名: ");

gets(tmpName);

if(strlen(tmpName)>10)

{

tmpName10='\0';

printf("查无此人!\n\n");

return;

}

nowptr=head;

/* 删第一笔 */

if(strcmp(nowptr->name,tmpName)==0)

{

clear=nowptr;

head=nowptr->next;

if(nowptr->next==NULL) /* 只第一笔 */

tail=NULL;

printf("\n%s已删除!\n",clear->name);

free(clear);

return;

}

else

{

prev=nowptr;

while(nowptr->next!=NULL) /* 删除中间的 */

{

nowptr=nowptr->next;

if(strcmp(nowptr->name,tmpName)==0)

{

clear=nowptr;

prev->next=nowptr->next;

printf("\n%s已删除!\n",clear->name);

free(clear);

return;

}

prev=prev->next; /* 上一笔也要跟着+1 */

}

if(nowptr->next == NULL) /* 要删除最后一个节点 */

{

if(strcmp(nowptr->name,tmpName)==0)

{

clear=nowptr;

prev->next=NULL;

tail=prev;

printf("\n%s已删除!\n",clear->name);

free(clear);

return;

}

else

printf("\n查无此人!\n");

}

}

}

}

void show_mode()

{

int count;

count=0;

if(head==NULL)

{

printf("\n\n无数据可显示!\n");

printf("\n\n请按任意键继续....");

getchar();

return;

}

else

{

nowptr=head;

printf("\n\n姓名\t\t分数");

printf("\n====\t\t====\n\n");

while((nowptr->next)!=NULL)

{

printf("%s",nowptr->name);

printf("%*d\n",20-strlen(nowptr->name), nowptr->score);

count++;

nowptr=nowptr->next;

}

printf("%s",nowptr->name);

printf("%*d\n",20-strlen(nowptr->name),nowptr->score);

count++; /* "%*d...",...详见第四章printf()的用法 */

nowptr=nowptr->next;

}

printf("====================\n");

printf("共%d笔数据!\n\n",count);

printf("\n\n请按任意键继续....");

getchar();

}

char choose_menu(void)

{

char option1;

system("cls");

printf("\n************************************");

printf("\n\t1.新增数据");

printf("\n\t2.删除数据");

printf("\n\t3.列出数据");

printf("\n\t4.离开系统");

printf("\n************************************");

printf("\n\t请输入您的选择(1,2,3,4): ");

do

{

option1 = getch();

}while((option1 != '1')&&(option1 != '2')&&(option1 != '3')

&&(option1 != '4'));

return option1;

}

void main(void)

{

char op='1';

while(1)

{

do{

op=choose_menu();

}while(op!='1' && op!='2' &&op!='3' && op!='4');

switch(op)

{

case '1':

insert_mode();

break;

case '2':

delete_mode();

printf("\n\n请按任意键继续...");

getchar();

break;

case '3':

show_mode();

break;

case '4':

return;

}

}

}

输出结果如下:

相关推荐
伏 念27 分钟前
AI Coding 零基础实战教程
c语言·进程·预处理
你家人养牛32 分钟前
OOC Relation Plugin:C 语言面向对象 开发的高效辅助工具
c语言·vscode
想你依然心痛42 分钟前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范
未来之窗软件服务2 小时前
计算机考试-C语言 应用题—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟·计算机考试
luj_17682 小时前
草酸与烟酸对消化及糖代谢的影响解析
服务器·c语言·开发语言·经验分享·算法
fei_sun2 小时前
【SystemVerilog】SystemVerilog与C语言的接口
c语言·开发语言
十月的皮皮4 小时前
C语言学习学习笔记20260704-中缀表达式求值(双栈法)
c语言·笔记·学习
wuminyu4 小时前
markword在高并发场景下变化剖析
java·linux·c语言·jvm·c++
星夜夏空994 小时前
C++学习(1) ——C与C++
c语言·c++·学习
wuyk5555 小时前
25. 函数指针表:用查表替代 switch-case,打造高效可维护的嵌入式状态机
c语言·stm32·单片机·mcu·51单片机