18.8.5单链表实现 V2.0

这是简单的单链表通讯录。

已经完成了基本操作:增、删、改、查、以及遍历通讯录名单。如果想要扩大通讯录的存储空间,更改头文件的"SIZE"的大小即可。

头文件:

#ifndef _addresslist_h
#define _addresslish_h
#define SUCCESS      1234
#define FAILURE      2345
#define SIZE         2

struct addresslist
{
	int num;
	char name[30];
	char sex[10];
	char tel[15];
	char address[30];
	
	struct addresslist *next;
};

typedef struct addresslist list;

int addresslistInit(list **l);

int print();

void menu();

int addinfo(list *l,int n);

int display(list *l);

int listdelete(list *l,int p,int *s_num,char *s_nam,char *s_sex,char *s_tel,char *s_add);

int listrevise(list *l);

int	listfind(list *l);

#endif

自定义函数:

#include<stdio.h>
#include"addresslist.h"
#include<stdlib.h>
#include<string.h>

void menu()
{
	//system("clear");
	printf("\n\n\n***************************\n");
	printf("1.显示通讯录        2.增加联系人 \n");
	printf("3.删除联系人        4.修改联系人 \n");
	printf("5.查找联系人        6.退出       \n");
}

int addresslistInit(list **l)
{
	*l = (list*)malloc(sizeof(list)*1); 
	if( NULL == *l)
	{
		return FAILURE;
	}
	
	(*l)->next = NULL;
	return SUCCESS;
}

int addinfo(list *l,int n)
{
	list *p = l,*q;
	q = (list*)malloc(sizeof(list)*1);
	
	int k = 1;
	
	if( NULL == l)
	{
		return FAILURE;
	}
	while ( k < n && p != NULL)
	{
		p = p->next;
		k++;
	}
	
	if( k > n && NULL == p)
	{
		return FAILURE;
	}
	
	printf("plz input number:\n");
	int a;
	scanf("%d",&a);
	q ->num = a;
	
	printf("plz input name:\n");
	char name[30]={0};
	scanf("%s",name);
	if( strcmp( name, "bye" ) == 0)
	{
		return SUCCESS;
	}
	else
	{	
		strcpy( q->name , name);
	}
	
	printf("plz input sex:\n");
	char sex[10]={0};
	scanf("%s",sex);
	strcpy(q->sex , sex);
	
	printf("plz input tel:\n");
	char tel[15]={0};
	scanf("%s",tel);
	strcpy(q->tel , tel);
	
	printf("plz input address:\n");
	char address[30]={0};
	scanf("%s",address);
	strcpy(q->address , address);
	
	q ->next = p->next;
	p ->next = q;
	
	return SUCCESS;
	
}

int display(list *l)
{
	if( NULL == l)
	{
		return FAILURE;
	}
	int s_sort;
	printf("请选择:\n按序号输出:1\n按姓名首字母输出:2\n");
	scanf("%d",&s_sort);
	list* q = l;
	if( 1 == s_sort )
	{
		while( q->next )
		{
			q = q->next;
			printf("序号:%d\n",q->num);
			printf("姓名:%s\n",q->name);
			printf("性别:%s\n",q->sex);
			printf("电话:%s\n",q->tel);
			printf("地址:%s\n",q->address);
			printf("\n");
		}
		printf("\n");
	return SUCCESS;
	}
	
	else if ( 2 == s_sort )
	{ 
		list *p = l;
		list *new_q = l;
		char sort_tmp[30] = {0};
		for( q = l; q != NULL ; q = q->next )
		{
			for( p = q->next; p != NULL ; p = p->next)
			{
				if( strncmp (q ->name,p ->name,10) > 0)
				{
					strcpy(sort_tmp , p ->name);
					strcpy(p ->name , q ->name);
					strcpy(q ->name , sort_tmp);
				}
			}
		}
		while( new_q->next )
		{
			new_q = new_q->next;
			printf("序号:%d\n",new_q->num);
			printf("姓名:%s\n",new_q->name);
			printf("性别:%s\n",new_q->sex);
			printf("电话:%s\n",new_q->tel);
			printf("地址:%s\n",new_q->address);
			printf("\n");
		}
		printf("\n");
	return SUCCESS;
	}
}

int listdelete(list *l,int p,int *s_num,char *s_nam,char *s_sex,char *s_tel,char *s_add)
{
	int a;
	if( NULL == l)
	{
		return FAILURE;
	}
	
	int k = 1;
	list* q = l;
	list* n;//用于先保存要删除的指针地址

	while ( k < p  )
	{
		q = q->next;
		k++;
	}
	//循环结束时, k必然等于n
	if( k > p || NULL == q)
	{
		return FAILURE;
	}
	
	     n  = q -> next; //先把 要被删除的地址存入n
	    
		*s_num = n->num;
	    s_nam = n->name;
		s_sex = n->sex;
		s_tel = n->tel;
		s_add = n->address;
	
		q ->next = n -> next; //将指针指向下下个地址
		free ( n ) ;       //释放掉被删除原先的地址

	return SUCCESS;	
}

int	listrevise(list *l)
{
	if( NULL == l)
	{
		return FAILURE;
	}
	list *p = l;
	int i = 1,n;
	printf("请输入想要被修改的序号:\n");
	scanf("%d",&n);
	while( i < n+1 )
	{
		p = p ->next;
		i++;
	}
	
	if( NULL == p)
	{
		return FAILURE;
	}
	else
	{
		printf("姓名:\n");
		scanf("%s",p ->name);
		printf("性别:\n");
		
		scanf("%s",p ->sex);
		printf("电话:\n");
		
		scanf("%s",p ->tel);
		printf("地址:\n");
		
		scanf("%s",p ->address);
	}
	return SUCCESS;
}

int listfind(list *l)
{
	if( NULL == l )
	{
		return FAILURE;
	}
	
	printf("按姓名查找: 1\n按电话查找: 2\n按地址查找: 3\n");
	char s_tmp[30] = {0};
	list* q = l;
	int location = 0;
	
	int s_searchnumber;
	scanf("%d",&s_searchnumber);
	if( 1 == s_searchnumber )
	{
		printf("请输入一个姓名:\n");
		scanf("%s",s_tmp);
		while( q )
		{	
			q = q->next;
			location++;
			if ( strcmp(q->name,s_tmp) == 0 )
			{
				return location;
			}
		}
		return FAILURE;
	}
	
	if( 2 == s_searchnumber )
	{
		printf("请输入一个电话:\n");
		scanf("%s",s_tmp);
		while( q )
		{	
			q = q->next;
			location++;
			if ( strcmp(q->tel,s_tmp) == 0 )
			{
				return location;
			}
		}
		return FAILURE;
	}
	
	if( 3 == s_searchnumber)
	{
		printf("请输入一个地址:\n");
		scanf("%s",s_tmp);
		while( q )
		{	
			q = q->next;
			location++;
			if ( strcmp(q->address,s_tmp) == 0 )
			{
				return location;
			}
		}
		return FAILURE;
	}
}

主函数:

#include<stdio.h>
#include"addresslist.h"
#include<stdlib.h>

	/*
	void print()
    {
	list *q = head;
	printf("序号:%d\n",q->num);
	printf("姓名:%s\n",q->name);
	printf("性别:%s\n",q->sex);
	printf("电话:%s\n",q->tel);
	printf("地址:%s\n",q->address);
	printf("\n");
    }
    */

void welcome()
{
	system("clear");
	printf("\n\n\n******************************\n");
	printf("********欢迎打开通讯录*******\n");
	printf("******************************\n");
	sleep(2);
}


int main()
{
	list *head = NULL;
	int c,ret,i;
	int y = 2;
	
	int  d_p; 
	int  s_num;
	char s_nam[30] = {0};
	char s_sex[10]={0};
	char s_tel[15]={0};
	char s_add[30]={0};
	ret = addresslistInit(&head);
	if( ret == SUCCESS)
	{
		printf("Init success!\n");
	}
	else if( FAILURE == ret)
	{
		printf("Init failure!\n");
	}
	
	welcome();
	
	while (1)
	{
		menu();
		scanf("%d",&c);
		switch(c)
		{
			case 1:ret = display(head);
			       if( FAILURE == ret )
				   {
					   printf("display failure!\n");
				   }
				   if( SUCCESS == ret )
				   {
					   printf("display success!\n");
				   }
				   break;
			
			case 2:
			       for( i = 0; i < SIZE ; i++)
					{
						ret = addinfo(head,i+1);
						if( FAILURE == ret)
						{
							printf("insrt failure!\n");
						}
						if( SUCCESS == ret )
						{
							printf("insrt success!\n");
						}
					}
				break;
			
			case 3:    printf("请输入要删除的序号:\n");
						scanf("%d",&d_p);
						ret = listdelete(head,d_p,&s_num,s_nam,s_sex,s_tel,s_add);
						if( FAILURE == ret)
						{
							printf("detele failure!\n");
						}	
						else
						{
							printf("detele success!\n");
						}
						break;
			
			case 4: ret = listrevise(head);
					if( SUCCESS == ret )
					{
						printf("revise success!\n");
					}
					if( FAILURE	== ret )
					{
						printf("revise failure!\n");
					}
						break;
			
			case 5: ret = listfind(head);
					if( FAILURE == ret )
					{
						printf("not existed!\n");
					}
					else
					{
						printf("have been found!\n而且他的序号是 %d\n",ret);
					}
					
						break;
	    	
			case 6:
				    exit(0);		
		}	
	}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41481342/article/details/81434112