#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct user
{
int ino;
char name[10];
char password[10];
struct user *nest;
};
struct user *creat()
{
// 1如何分配空间?也就是有多少个?
// 1解决方案首先扫面一个文件内容。每扫描一次计数一次
FILE *pf=fopen("user.txt","r");
struct user temp={0};
int isresult;
struct user * head=NULL;//记录头结点
struct user *puser=NULL;///
struct user *pre=NULL;//记录上一个结点
// 扫描文件,记录行数
while(1)
{
isresult=fscanf(pf,"%d%s%s",&temp.ino,temp.name,temp.password);
if(3>isresult)
break;
puser=(struct user *)malloc(sizeof(struct user));
*puser=temp;
puser->nest=0;
if(head==NULL)
{
head=puser;
pre=puser;
}
else
{
pre->nest=puser;
pre=puser;
}
}
fclose(pf);
return head;
}
//遍历
void searchall(struct user * head)
{
struct user * temp=head;
if (temp==0)
{
printf("空链表!\n");
}
while(temp!=0)
{
printf("%d\t%s\t%s\n",temp->ino,temp->name,temp->password);
temp=temp->nest;
}
}
//查找
int search(struct user *head,char *pfindname)
{
struct user *temp=head;
while(temp!=0)
{
if(strcmp(temp->name,pfindname)==0)
{
printf("%d\t%s\t%s\n",temp->ino,temp->name,temp->password);
return 1;
}
temp=temp->nest;
}
return -1;
}
//更新
int update(struct user *head)
{
struct user *temp=head;
struct user updatepuser;
char tempupdate[10]={0};
int issearch=0;
printf("请输入要更新的用户的名字\n");
scanf("%s",&tempupdate);
printf("请输入新的用户的ID\n");
scanf("%d", &updatepuser.ino);
printf("请输入新的用户的名字\n");
scanf("%s",updatepuser.name);
printf("请输入新的用户的密码\n");
scanf("%s",updatepuser.password);
if (temp==0)
{
printf("空链表!\n");
}
while(temp!=0)
{if(strcmp(temp->name,tempupdate)==0)
{
temp->ino=updatepuser.ino;
strcpy(temp->name,updatepuser.name);
strcpy(temp->password,updatepuser.password);
printf("已经更新完成!\n");
printf("更新后的信息为:\n");
searchall(head);
return 1;
}
temp=temp->nest;
}
return -1;
}
//存盘
void save(struct user *head)
{struct user *temp=head;
int i=0;
FILE *pf=fopen("user.txt","w");
while(temp!=0)
{
fprintf(pf,"%d\t%s\t%s\n",temp->ino,temp->name,temp->password);
temp=temp->nest;
}
fclose(pf);
printf("存盘成功!\n");
}
//删除
struct user * Delete(struct user *head,char * deletename)
{
struct user *temp=head;
struct user *pre=head;
// int isdelete=0;
int ifFind=0;
while(1)
{
if(head==0) break;
if((strcmp(head->name,deletename)==0))
{
if(temp!=head &&head->nest!=NULL)
{
pre->nest=head->nest;
printf("删除成功3!\n");
free(head);
}
if(head==temp)//头结点
{
temp=head->nest;
printf("删除成功2!\n");
free(head);
}
if(head->nest==0)//最后结点
{
pre->nest=NULL;
printf("删除成功1!\n");
free(head);
}
ifFind=1;
break;
}
if(head!=temp)
{
pre=pre->nest;
}
head=head->nest;
}
if (ifFind==0) printf("没有找到这个人!\n");
return temp;
}
//插入
struct user * insert(struct user *head,char * pFindName,struct user * insertpuser)
{
struct user *temp=head;
struct user *pre=head;
struct user *pnew=NULL;
int ifFind=0;
if(head==NULL)
{
pnew=(struct user *)malloc(sizeof(struct user));
*pnew=*insertpuser;
pnew->nest=NULL;
temp=pnew;
return temp;
}
while(1)
{
if(head==0)break;
if(strcmp(head->name,pFindName)==0)
{
pnew=(struct user *)malloc(sizeof(struct user));
*pnew=*insertpuser;
pnew->nest=NULL;
if(head!=temp)
{
pre->nest=pnew;
pnew->nest=head;
}
if(head==temp)
{temp=pnew;
pnew->nest=head;
}
ifFind=1;
printf("插入成功!\n");
break;
}
if(head!=temp)
{
pre=pre->nest;
}
head=head->nest;
}
if (ifFind==0) printf("没有找到这个人!\n");
return temp;
}
struct user * add(struct user *head,struct user *adduser)
{
struct user * temp=head;
struct user * pre=head;
struct user * pnew=NULL;
if(head==NULL)
{
pnew=(struct user *)malloc(sizeof(struct user ));
*pnew=*adduser;
pnew->nest=NULL;
temp=pnew;
return temp;
}
while(1)
{
if(head->nest==0) break;
head=head->nest;
}
pnew=(struct user *)malloc(sizeof(struct user ));
*pnew=*adduser;
pnew->nest=NULL;
head->nest=pnew;
printf("增加成功!\n");
return temp;
}
int main()
{
//创建一个顺序表,用于获得文件的内容
int icount=0;//就是行数
struct user *head;
int i=0;
int select=0;
int iScanfResult;//输入选择
while(1)
{
printf("------------------------------------\n");
printf("------------用户管理----------------\n");
printf("-------------1 提取-----------------\n");
printf("-------------2 遍历-----------------\n");
printf("-------------3 查找-----------------\n");
printf("-------------4 更改-----------------\n");
printf("-------------5 存盘-----------------\n");
printf("-------------6 删除-----------------\n");
printf("-------------7 插入-----------------\n");
printf("-------------8 增加-----------------\n");
printf("-------------0 退出------------------\n");
printf("------------------------------------\n");
printf("\n");
while(1)
{
printf("请选择:");
iScanfResult=scanf("%d",&select);;
if (iScanfResult>0) break;
else
{
printf("请输入正确的数字!\n");
fflush(stdin);
}
}
switch(select)
{
case 1:
{
head=creat();
}break;
case 2:
{
//遍历
searchall(head);
}break;
case 3:
{
char pfindname[10]; //查找一个临时名字
int ispfindname=0;
int i=0;
int flag=0;
printf("请你输入一个你要查找的用户的名字\n");
scanf("%s",&pfindname);
ispfindname=search(head,pfindname);
if(-1==ispfindname)
{printf("没有找到\n");
}
}break;
case 4:
{//更新
int isupdate=0;
isupdate=update(head);
if(-1==isupdate)
{
printf("没有找到\n");
}
}break;
case 5:
{//存盘
save(head);
}break;
case 6:
{//删除
char deletename[10];
printf("请你输入一个你要删除的用户的名字\n");
scanf("%s",&deletename);
head=Delete(head,deletename);
}break;
case 7:
{
// 插入
char sTemp[10]={0};
struct user insertpuser;
printf("请输入要插入的用户姓名:");
scanf("%s",sTemp);
printf("请输入新的用户的ID\n");
scanf("%d", &insertpuser.ino);
printf("请输入新的用户的名字\n");
scanf("%s",insertpuser.name);
printf("请输入新的用户的密码\n");
scanf("%s",insertpuser.password);
head=insert(head,sTemp,&insertpuser);
}break;
case 8:
{
struct user insertpuser;
printf("请输入新的用户的ID\n");
scanf("%d", &insertpuser.ino);
printf("请输入新的用户的名字\n");
scanf("%s",insertpuser.name);
printf("请输入新的用户的密码\n");
scanf("%s",insertpuser.password);
head=add(head,&insertpuser);
}break;
case 0:
{
}break;
}
}
return 0;
}
数据结构之单链表
最新推荐文章于 2023-08-22 22:38:37 发布