📄 xueji.c
字号:
/////作者:姚伏龙 EMAIL:yfl16882000@yahoo.com.cn
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#include"string.h"
#define NULL 0 ////定义常量与包所需库函数///////////
#define LEN sizeof(struct node)
struct node
{
char name[20]; ///字符数组,存放名字/////
char sex[15]; ///日期结构体birthday 存放生日///
unsigned long TEL; ///////无符号长整型TEL存放电话//
char addr[30]; ////////存放E-MAIL 地址///
struct node *next; /////////构成链表所需///
}o={NULL,NULL,NULL,NULL,NULL};
add()
{
char a[20],b[30]; ////缓冲用语暂存名字与E-MAIL////
struct node *j,*k,*top; ///结构体指针变量j,k,top///
top=&o; /////////头结点置空
k=(struct node *)malloc(LEN); //开辟地址空间
printf("请输入姓名:");
scanf("%s",a); ///将名字存于a数组
strcpy(k->name,a); ///用字符串复制函数将a数组复制到k的name成员中//
printf("请输入性别:");
scanf("%s",&k->sex);
printf("请输入电话号码:");
scanf("%ld",&k->TEL);
printf("请输入地址:");
scanf("%s",b);
strcpy(k->addr,b); //////////同上//
k->next=NULL; ///k结点下一位置置空/////如下语句判断插入位置///
if(top->next==NULL) //////头结点下一位置为空时///判断插入位置//
{
top->next=k;
k->next=NULL;
}
else
{ ////利用while循环和判断语句判断插入位置///////
while(top->next!=NULL) ///////头结点下一位置不空时//
{
j=top; ////暂存头结点///
top=top->next;///每循环一次top指向下一位置//
if(strcmp(k->name,top->name)<0) ////利用strcmp函数比较名字
{ /////的大小,若"<0"说明k中名字
j->next=k; ///k->name小于p->name//
k->next=top; ///若if语句为真插于top之前
break;
}
}
if(k->next==NULL)
{
if(strcmp(k->name,top->name)<0) ///同上
{
j->next=k;
k->next=top;
}
else
{ //////if语句为假时,插入于比k->name大的位置之前//
top->next=k;
k->next=NULL;
}
} ///////由while循环和if判断语句并利用strcmp函数排序
}
printf("您的操作已完成\n\n\n\n\n");
}
display()
{
struct node *top; ///*局部变量声明*///
top=&o; ///头指针取地址,头指针实际为空,数据皆存于其下一位置///
printf("\n\n姓名 生日 电话 E-mail\n\n");
if(top->next!=NULL) ///*判断链表是否为空*//
{
while(top->next!=NULL) ///判断是否已输出完///
{
top=top->next;
printf("%-19s%-15s%-11d%14s%\n",top->name,top->sex,top->TEL,top->addr);
}
}
else
printf("记录为空!\n");///链表为空时,提示///
printf("\n\n\n\n\n");
}
del(int b) ///形参b传递删除记录位置///
{
struct node *top,*p;
int i=0;///位置记录变量/////
top=&o;
while(top->next!=0&&i<b-1)////定位//
{
top=top->next;
++i;
}
p=top->next;
top->next=p->next;///删除////
free(p); ///释放删除记录所占空间///
}
modify(int c)
{
int i=0; ///记录定位变量中间值
char a[20],b[20];
struct node *top;
top=&o;
while(top->next!=0&&i<c)
{
top=top->next;
++i;
} ////定位判断语句////
printf("更改后的名字:\n");
scanf("%s",a);
strcpy(top->name,a);
printf("更改后的性别:");
scanf("%s",top->sex);
printf("新电话号码:");
scanf("%ld",&top->TEL);
printf("您的新地址:");
scanf("%s",b);
strcpy(top->addr,b);
}
find()
{
struct node *top; ////声明局部变量/////
char a[20]; ////定义字符数组,存放姓名///
top=&o; ///头指针取地址,并置空
scanf("%s",a);
while(top->next!=NULL)////循环语句与判断语句一起够成定位功能///
{
top=top->next;
if(strcmp(a,top->name)==0)///利用strcmp比较所输入姓名是否与链表中
{ ////记录相同,为真则打印该记录,否则提示未找到
printf("姓名 生日 电话 E-mail\n\n");
printf("%-19s%-15s%-11d%14s%\n\n\n\n\n\n",top->name,top->sex,top->TEL,top->addr);
break;
}
}
if(strcmp(a,top->name)!=0) ////未找到,提示///
printf("没有该记录!!!\n\n\n\n");
}
void main()
{
char s1[100];////字符数组,存放所输入的判断密码是否正确
char c; ///局部变量
int i,a,b;
printf("欢迎使用小龙作品!\n\n 请输入你的密码:");
scanf("%s",&s1);////将输入存于数组s1中
if(strcmp(s1,"yfl")==0)///判断密码是否正确,为真则进入while循环,密码设置在这里
while(1) //////否则退出
{
printf("您想做什么?请输入:\n 1:添加新记录\n 2:删除记录\n 3:更改记录\n");
printf(" 4:查找记录\n 5:显示记录\n 6:返回\n");
c=getchar();
switch(c)
{
case'1':
add();///调用添加函数///
break;
case'2':
{
printf("请输入位置:");
scanf("%d",&a);
del(a);///调用删除函数,实现删除////
}
break;
case'3':
{
printf("请输入位置:");
scanf("%d",&b);
modify(b);////调用更改函数/////
}
break;
case'4':
{
printf("请输入姓名:\n\n");
find();////调用查找函数////
}
break;
case'5':
display();////调用显示函数,显示链表全部记录
break;
case'6':
return;///结束循环////
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -