编程考核—文件与链表的操作应用
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char n[20][20],x[20][20],f[20][20],p[20][20];
typedef struct student{
char name[20];
char xuehao[20];
char fangxiang[20];
char phone[20];
struct student*next;
}*linklist;
void menu(){
printf("*********************************************\n");
printf(" 软件科技协会成员信息 \n");
printf(" \n");
printf(" [0]退出程序 \n");
printf(" [1]输出成员信息 \n");
printf(" [2]找到成员并删除 \n");
printf(" [3]添加新成员 \n");
printf(" [4]更改联系方式 \n");
}
linklist Init()
{
linklist head=(linklist)malloc(sizeof(struct student));
head->next=NULL;
return head;
}
void insert(linklist head,char n[],char x[],char f[],char p[]){
linklist h=(linklist)malloc(sizeof(struct student));//开辟节点很重要啊啊啊啊啊啊
if(head->next==NULL){
strcpy(h->name,n);
strcpy(h->xuehao,x);
strcpy(h->fangxiang,f);
strcpy(h->phone,p);
head->next=h;
h->next=NULL;
}
else{
strcpy(h->name,n);
strcpy(h->xuehao,x);
strcpy(h->fangxiang,f);
strcpy(h->phone,p);
h->next=head->next;
head->next=h;
}
}
void deletestu(linklist head){
int flag=0;
printf("请输入要删除的人名\n");
char Name[20];
linklist p=head->next;
linklist cur=head;
scanf("%s",&Name);
while(p){
if(strcmp(p->name,Name)==0){ //要是strcmp,不能是p->name==Name
cur->next=p->next;
free(p);
flag=1;
break;
}
cur=cur->next;
p=p->next;
}
if(flag==1)
printf("操作成功\n");
else{
printf("操作失败\n");
}
}
linklist add(linklist head){
linklist newmem=(linklist)malloc(sizeof(struct student));
printf("请输入该成员的相关信息\n");
printf("请输入该成员的姓名\n");
printf("请输入该成员的学号\n");
printf("请输入该成员的学习方向\n");
printf("请输入该成员的联系方式\n");
scanf("%s %s %s %s",&newmem->name,&newmem->xuehao,&newmem->fangxiang,&newmem->phone);
newmem->next=head->next;
head->next=newmem;
printf("操作成功\n");
return newmem;
}
void alter(linklist head){
int flag=0;
char Name[20];
printf("输入要更改的尘缘的名字\n");
scanf("%s",&Name);
linklist cur=head;
linklist p=head->next;
while(p){
if(strcmp(p->name,Name)==0){
flag=1;
break;
}
p=p->next;
cur=cur->next;
}
if(flag==1){
printf("查找成功\n");
printf("请输入要更改的联系方式\n");
char Phone[20];
scanf("%s",&Phone);
strcpy(p->phone,Phone);
printf("操作成功\n");
}
else{
printf("不好意思,没有这个人\n");
}
}
void paixu(linklist head){
linklist p,q;
char arr[20];
if( head==NULL){
return ;
}
if( head->next==NULL){
return ;
}
for(p=head->next;p!=NULL;p=p->next){
for(q=p->next;q!=NULL;q=q->next){
if(strcmp(p->xuehao,q->xuehao)>0){
// arr=p->xuehao;
// p->xuehao=q->xuehao;
// q->xuehao=arr;
strcpy(arr,p->xuehao);
strcpy(p->xuehao,q->xuehao);
strcpy(q->xuehao,arr);
}
}
}
}
void print(linklist head){
printf("姓名\t 学号\t 方向\t 联系方式\t\n");
linklist p=head->next;
while(p!=NULL){
printf("%s\t %s\t %s\t %s\t\n",p->name,p->xuehao,p->fangxiang,p->phone);
p=p->next;
}
}
int main()
{
linklist head=Init();
FILE* pf=fopen("D:\\members.txt","r");
if(pf==NULL){
printf("读取文件失败\n");
}
else{
printf("读取成功\n");
}
for(int i=0;i<5;i++){
fscanf(pf,"%s %s %s %s",&n[i],&x[i],&f[i],&p[i]);
}
fclose(pf);
for(int i=1;i<5;i++){
insert(head,n[i],x[i],f[i],p[i]);
}
int n;
menu();
while(scanf("%d",&n)!=-1){
switch (n){
case 0:
printf("退出程序\n");
return 0;
break;
case 1:
paixu(head);
print(head);
break;
case 2:
deletestu(head);
print(head);
break;
case 3:
add(head);
print(head);
break;
case 4:
alter(head);
print(head);
break;
defalt :
break;
}
}
}