list.h
#pragma once //预防头文件重复引用
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <windows.h>
#include<assert.h>
#define MAX_N 30 //姓名最大长度
#define MAX_T 15 //电话号码最大长度
#define MAX_A 100 //地址最大长度
//用户信息结构体
typedef struct InfoNode
{
char _name[MAX_N]; //姓名
char _telephone[MAX_T]; //电话号码
char _address[MAX_A]; //地址
}InfoNode;
//输入时以循环双链表存储
typedef struct InfoNode_List
{
InfoNode* _ListInfo; //结构体指针来存放用户信息
struct InfoNode_List* _next; //指向下一个节点
struct InfoNode_List* _pre; //指向上一个节点
}InfoNode_List;
//初始化链表
void InitList(InfoNode_List* pl);
//输入用户信息节点
void ScanfNode(InfoNode* pnode);
//增加链表节点
void AddList(InfoNode_List* pl);
//修改用户信息
void ChangeNode(InfoNode* pnode);
//删除节点
void DeleteListNode(InfoNode_List* pl);
//姓名查找
InfoNode_List* FindName(InfoNode_List* phead, char* name);
//电话号码查找
InfoNode_List* FindTelephone(InfoNode_List* phead, char* telephone);
//打印信息
void ShowInfo(InfoNode_List* phead);
//打印一个用户的信息
void ShowOnce(InfoNode* pi);
//按字符ASCLL比较两个用户信息的大小
int CompareInfo(InfoNode* pi1, InfoNode* pi2);
//排序 --> 插入排序法
void InsertSort(InfoNode_List* phead);
//当前信息写入文件
void WriteFileInfo(InfoNode_List* phead);
//读取把文件信息插入链表 (头插法)
void ReadFileInfo(InfoNode_List* phead);
//模拟加载页面
void my_loading(const int time);
//0.5秒睡眠加清屏
void SleepCls();
//模拟进度条
void ProgressBar();
list.c
#include "list.h"
//睡眠加清屏
void SleepCls()
{
Sleep(500);//程序在这里暂停0.5秒
system("cls");//清屏操作
}
//模拟进度条
void ProgressBar()
{
int i = 0;
char arr[51] = { 0 }; //存放进度的"#"
char* brr = "|/-\\"; //模拟转圈圈
printf("\n");
for (i = 0; i < 50; i++)
{
arr[i] = '#';
printf("[%-50s][%d%%][%c]\r", arr, (i + 1) * 2, brr[i % 4]);
Sleep(50);
}
printf("\n"); //退格后的光标向下一行移动
}
//初始化链表
void InitList(InfoNode_List* phead)
{
assert(phead);
phead->_next = phead; //头结点的下一个节点指向自己
phead->_pre = phead; //头结点的上一个节点指向自己
}
//节点输入用户信息
void ScanfNode(InfoNode* pnode)
{
char name[MAX_N] = { '\0' }, telephone[MAX_T] = { '\0' }, address[MAX_A] = { '\0' };
printf("_______________________________________\n");
printf("|\n");
printf("|请输入用户姓名-->");
scanf("%s", name);
strcpy(pnode->_name, name);
printf("|请输入用户电话号码-->");
scanf("%s",telephone);
strcpy(pnode->_telephone, telephone);
printf("|请输入用户地址-->");
scanf("%s",address);
strcpy(pnode->_address, address);
printf("|______________________________________\n");
}
//修改用户信息
void ChangeNode(InfoNode* pnode)
{
char choose_C;
char name[MAX_N] = { '\0' }, telephone[MAX_T] = { '\0' }, address[MAX_A] = { '\0' };
printf("_______________________________________\n");
printf("|\n");
printf("|请输入修改后用户姓名-->");
scanf("%s", name);
strcpy(pnode->_name, name);
printf("|请输入修改后用户电话号码-->");
scanf("%s", telephone);
strcpy(pnode->_telephone, telephone);
printf("|是否修改用户的地址(Y或者y)-->");
getchar(); //吸收电话号码输入后的回车字符
scanf("%c", &choose_C);
if (choose_C == 'y' || choose_C == 'Y')
{
printf("|请输入用户地址-->");
scanf("%s", address);
strcpy(pnode->_address, address);
}
else
{
printf("|用户地址 -->%s\n", pnode->_address);
}
printf("|______________________________________\n");
}
//增加用户信息
void AddList(InfoNode_List* phead) //采用头插法
{
assert(phead); //防止传入野指针
InfoNode_List* node;
node = (InfoNode_List*)malloc(sizeof(InfoNode_List));
node->_ListInfo = (InfoNode*)malloc(sizeof(InfoNode)); //为用户信息结构体开辟空间
ScanfNode(node->_ListInfo); //输入用户信息
//头插法进行节点的插入
node->_next = phead->_next;
phead->_next->_pre = node;
node->_pre = phead;
phead->_next = node;
printf("----------------------------------\n");
printf("%s的信息增加完毕\n\n", node->_ListInfo->_name);
}
//删除节点
void DeleteListNode(InfoNode_List* phead)
{
assert(phead);
InfoNode_List* pre = (InfoNode_List*)malloc(sizeof(InfoNode_List));
char sure='\0';
int option=0;
//打印内部菜单
printf("-----------------------------------------\n");
printf("|\t按用户姓名删除(系统默认)-->1\t|\n");
printf("-----------------------------------------\n");
printf("|\t按用户电话号码查找并删除-->0\t|\n");
printf("-----------------------------------------\n");
printf("您的选择-->");
scanf("%d", &option);
if (option != 0) //默认按照姓名查询删除
{
option = 1;
}
getchar();