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;

}

}

}

输出结果如下:

相关推荐
@yanyu66612 小时前
C编译器安装与第一个C程序
c语言·开发语言
山下梅子酒22512 小时前
洛谷-入门-B2070
c语言
Logic10112 小时前
C语言/数据结构位运算题解:异或XOR找出多任务下载器中的“独特下载速度“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
MI_farmer14 小时前
Anaconda 安装在 D 盘但虚拟环境跑到 C 盘,以及 Conda PermissionError: WinError 5 的解决方法
c语言·开发语言·conda
心中有你021415 小时前
C语言 二叉搜索树(BST)超详细完整实现(插入+查找+删除+三种遍历+内存释放)
c语言
神仙别闹16 小时前
基于C语言实现 TINY+ 编译器
c语言·开发语言·数据库
共享家952717 小时前
C语言-408
c语言·开发语言
ACP广源盛1392462567319 小时前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
芯祥联1 天前
STM32 上跑 MQTT 怎么选?嵌入式 MQTT 客户端 C 语言实现对比
c语言·stm32·单片机·嵌入式硬件·网络协议·开源·broker
Escalating_xu1 天前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言