数据结构之单链表

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值