通讯录链表2.0实现(删除功能BUG已解决,插入功能仍有BUG)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1000
#define RED  "\033[0;32;31m"
#define NONE "\033[m" 
int num;

struct student
{
	char name[20];
	int age;
	char phone[20];
	struct student * next;
};

typedef struct student STU;

STU *insert(STU *head)
{
	system("clear");
	int location,count,flag;
	STU *p,*q1,*q2;
	p = (STU *) malloc (sizeof(STU));
	while(1)
	{
		flag = 0;
		count = 1;
		if(num == 0)
		{
			printf("通讯录内容为空(等待自动跳回主菜单)\n");
			sleep (3);
			return head;
		}
		printf("请输入要插入的新联系人的姓名、年龄、电话(输入quit退回主菜单)\n");
		scanf("%s",p->name);
		if(!strcmp(p->name,"quit"))
		{
			return head;
		}
		scanf("%d",&p->age);
		scanf("%s",p->phone);
		printf("请输入要插入的位置\n");
		scanf("%d",&location);
		q2 = head;
		while(count != location && q2->next != NULL)
		{
			q1 = q2;
			q2 = q2->next;
			++count;
		}
		if(count == location)
		{
			flag = 1;
			if(location == 1)
			{
				head = p;
				p->next = q2->next;
			}
			else
				if(location == num + 2)
				{
					q2->next = p;
					p->next = NULL;
				}
				else
				{
					q1->next = p;
					p->next = q2;
				}
			++num;
			printf("插入成功\n");
		}
		if(!flag)
		{
			printf("插入失败\n");
		}
	}
}

void search(STU *head)
{
	system("clear");
	STU *p,*q;
	int i,flag;
	p = (STU *) malloc (sizeof(STU));
	while(1)
	{
		flag = 0;
		if(num == 0)
		{
			printf("通讯录内容为空(等待自动跳回主菜单)\n");
			sleep(3);
			break;
		}
		q = head;
		printf("请输入要查看的联系人的姓名(输入quit退回主菜单)\n");
		scanf("%s",p->name);
		if(!strcmp(p->name,"quit"))
		{
			break;
		}
		for(i = 0; i < num;i++)
		{
			if(!strcmp(p->name,q->name))
			{
				printf("%s %d %s\n",q->name,q->age,q->phone);
				flag = 1;
			}
			q = q->next;
		}
		if(!flag)
		{
			printf("通讯录中无此成员\n");
		}
	}
}


STU *delete(STU *head)
{	
	system("clear");
	STU *p,*q,*t;
	int flag;
	p = (STU *) malloc (sizeof(STU));
	while(1)
	{
		flag = 0;
		if(num == 0)
		{
			printf("通讯录内容为空(等待自动跳回主菜单)\n");
			sleep (3);
			return head;
		}
		q = head;
		printf("请输入要删除人的姓名(输入quit退回主菜单)\n");
		scanf("%s",p->name);
		if(!strcmp(p->name,"quit"))
		{
			return head;
		}
		while(strcmp(q->name,p->name) && q->next != NULL)
		{
			t = q;
			q = q->next;
		}	
		if(!strcmp(q->name,p->name))
		{
			flag = 1;
			if(q == head)
			{
				head = q->next;
			}
			else
			{
				t->next = q->next;
			}
			free(q);
			--num;
			printf("删除成功\n");
		}
		if(!flag)
		{
			printf("查无此人\n");
		}
	}
}

STU *create()
{
	system("clear");
	STU *head,*p1,*p2;
	num = 0;
	p1 = p2 = (STU *) malloc (sizeof(STU));
	printf("请输入联系人的姓名、年龄和电话!(输入quit退回主菜单)\n");
	scanf("%s",p1->name);
	head = NULL;
	while(strcmp(p1->name,"quit"))
	{
		scanf("%d",&p1->age);
		scanf("%s",p1->phone);
		++num;
		if(num == 1)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
		p2 = p1;
		p1 = (STU *) malloc (sizeof(STU));
		printf("请输入联系人的姓名、年龄和电话!(输入quit退回主菜单)\n");
		scanf("%s",p1->name);
	}
	p2->next = NULL;
	return head;
}


void print(STU *head)
{
	system("clear");
	getchar();
	STU *p;
	printf("当前通讯录内容为:\n");
	p = head;
	if(head != NULL)
	{
		do
		{
			printf("%s %d %s\n",p->name,p->age,p->phone);
			p = p->next;
		}while(p != NULL);
	}
	printf("请按任意键退出\n");
	getchar();
}

void welcome()
{
	system("clear");
	printf("\n\n\n\n\n");
	printf(RED"                欢迎来到主菜单:\n"NONE);
	sleep(3);
}

int menue()
{
	system("clear");
	printf(RED"\n\n\n\n                主菜单\n\n\n"NONE);
	printf(RED"1.新建通讯录              2.查看信息\n"NONE);
	printf(RED"3.查找信息                4.删除信息\n"NONE);
	printf(RED"5.修改信息                6.插入信息\n"NONE);
	printf(RED"5.退出通讯录\n"NONE);
	printf(RED"请输入序号进入指定功能\n"NONE);
}


int main()
{
    STU *head;
	int choice;
	welcome();
	while(1)
	{
M:      menue();
		scanf("%d",&choice);
	
		switch(choice)
		{
			case 1:
				{
					head = create();
					break;
				}
			case 2:
				{
					print(head);
					break;
				}
			case 3:
				{
					search(head);
					break;
				}
			case 4:
				{
					head = delete(head);
					break;
				}
			case 5:
				{
					/*transfer(per);
					break;*/
				}
			case 6:
				{
					head = insert(head);
					break;
				}
			case 7:
				{
					exit (0);
					break;
				}
			default:
				{
					goto M;
				}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ZCzhouchao1/article/details/81394268
今日推荐