数据结构 三

用链表做简易的通讯录

node.h 文件

#ifndef  _NODE_H_
#define  _NODE_H_
#define TRUE    0
#define ERROR  -1
#define FLAST  -2	
typedef int Data;
typedef struct _node
{
	Data id;
	long phone;
	char name[20];
	struct _node *next;
}Node;
typedef Node *Head;
//创建链表并添加联系人
int Create(Head k,Data id,long phone,char *name );

//按名字进行排序
Head SelectSort(Head pa);

//查找联系人
void Find(Head pa,char *name);

//删除联系人
void Delete(Head pa,char *name);

//打印所有联系人信息
void DisplayAll(Head k);

//打印当前创建的联系人信息
void Display(Head k);

//主菜单
int Menu();

//功能菜单
int FunMeun();

//功能选择
int Select();

#endif// _NODE_H_

node.c 文件

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

int Create(Head k,Data id,long phone,char *name )
{
	if(NULL==k)
		return ERROR;
	Head node=(Head)malloc(sizeof(Node)/sizeof(char) );
	if(NULL==node)
		return FLAST;
	printf("请创建用户\n");
	printf("请输入ID:\n");
	scanf("%d",&node->id);
	printf("请输入号码:\n");
	scanf("%lu",&node->phone);
	printf("请输入姓名:\n");
	scanf("%s",node->name);
	node->next=NULL;
	Head temp=k;
	while(temp->next)
	{
		temp=temp->next;
	}
	temp->next=node;
	return TRUE;
}
Head SelectSort(Head pa)
{
	Head first;//排列后有序链表的头指针
	Head tail;//排列后有序链表的尾指针
	Head p_min;
	Head min;//存储最小节点
	Head p;//当前比较的结点
	
	first =NULL;
	while(pa!=NULL)//找链表中最小结点
	{
		for(p=pa,min=pa;p->next!=NULL;p=p->next)//遍历链表中的结点,找出最小结点
		{
			if((p->next->name)<(min->name) )//找一个比当前min小的结点
			{
				p_min=p;//保存找到结点的前结点p是p->next的前结点
				min=p->next;//保存更小结点
			}
		}
		if(first==NULL)//如果有序链表现在还是一个空链表
		{
			first=min;//第一次找到最小的结点
			tail=min;//尾指针指向最后一个结点
		}
		else//链表中有结点
		{
			tail->next=min;//把最小节点放到最后
			tail=min;//尾指针也要指向他
		}
		
		if(min==pa)//找到最小节点就是第一个结点
		{
			pa=pa->next;//如果是最小结点就把他放在第一个结点上
		}
		else//如果不是第一个结点
		{
			p_min->next=min->next;//最小结点指向当前min的next
		}
	}
	if(first!=NULL)
	{
		tail->next=NULL;
	}
	pa=first;
	return pa;
}
void Find(Head pa,char *name)
{
	Head p1=pa;
	Head p2=NULL;
	while(p1!=NULL&&(p1->next)!=NULL)
	{
		p2=p1->next;
		if(p2!=NULL&strcmp(p2->name,name)==0)
		{
			printf ("ID: %d 姓名: %s 手机号码: %lu\n", p2->id, p2->name,p2->phone);
			return ;
		}
		else if(p2->next==NULL&&(strcmp(p2->name,name)==0))
		{
			printf("没有\n");
		}
		p1=p1->next;
	}
}
void Delete(Head pa,char *name)
{
	Head p1=pa;
	Head p2=NULL;
	while(p1!=NULL&&(p1->next)!=NULL)
	{
		p2=p1->next;
		if(p2!=NULL&&(strcmp(p2->name,name)==0))
		{
			p1->next=p2->next;
			free(p2);
			printf("好友已删除\n");
		}
		else if(p2->next==NULL&&(strcmp(p2->name,name)==0))
		{
			printf("没有\n");
		}
		p1=p1->next;
	}
}
void DisplayAll(Head k)
{
	if(NULL==k)
		return;
	Head temp=k->next;
	while(temp)
	{
		printf ("ID: %d 姓名: %s 手机号码: %lu\n", temp->id, temp->name,temp->phone);
		temp=temp->next;
	}
	printf("\n");
}
void Display(Head k)
{
	if(NULL==k)
		return;
	Head temp=k->next;
	while(temp)
	{
		if(temp->next==NULL)
		{
			printf("用户%s已创建成功\n",temp->name);
			
		}
		temp=temp->next;
	}
	printf("\n");
}
int Menu()
{
	printf("1.请输入\n");
	printf("2.请显示\n");
	printf("3.请搜索\n");
	printf("4.请删除\n");
	printf("0.显示主菜单\n");
}
int FunMeun()
{
    printf ("\n\n");
    printf (" 功能选择:          \n");
    printf ("                    \n");
    printf (" 显示主菜单:       0\n");
    printf (" 添加好友:         1\n");
    printf (" 查看当前好友信息: 2\n");
    printf (" 搜索好友:         3\n");
    printf (" 删除好友:         4\n\n");
}
int Select()
{   
    int choice;
    while (1)
    {
        scanf("%d", &choice);
        if (!(choice>=0 && choice<=4))
        {
            printf ("\n\t输入错误,重选0-4:\n\n");
            continue;
        }
        else
        {
            break;
        }
    }
    return choice;
}

main.c文件

#include "node.h"
#include <stdio.h>
#include <stdlib.h>
int main()
{
	
	int n;
	int id;
	long phone;
	char name[20];
	Head head_node=(Head)malloc(sizeof(Node)/sizeof(char));
	if(head_node==NULL)
	{
		return ERROR;
	}
	head_node->next=NULL;
	Menu();
	while(1)
	{
		scanf("%d",&n);
		switch(n)
		{
			case 0:
			{
				Menu();
			}
			break;
			case 1:
			{
				if(head_node)
				{
					if(Create(head_node, id, phone,name )!=TRUE)
					{
						return ERROR;
					}
				}
				Display(head_node);
				head_node= SelectSort(head_node);
				FunMeun();
			}
			break;
			case 2:
			{
				DisplayAll(head_node);
				FunMeun();
			}
			break;
			case 3:
			{
				printf("请输入你要查找的姓名\n");
				scanf("%s",name);
				Find(head_node,name);
				FunMeun();
			}
			break;
			case 4:
			{
				printf("请输入你要删除的姓名\n");
				scanf("%s",name);
				Delete(head_node,name);
				FunMeun();
			}
			break;
			default:
			{
				return ERROR;
			}
			
		}
	}
	
	
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41936758/article/details/84927218