单链表实现通讯录:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define blue "\e[1;34m"
#define yellow "\e[1;33m"
#define red "\e[0;31m"
#define cyan "\e[0;36m"
#define purple "\e[0;35m"
#define brown "\e[0;33m"
#define white "\e[1;37m"
#define none "\e[0m"
#define SUCCESS 10000
#define FAILURE 10001
struct student
{
char name[20];
char num[20];
struct student *next;
};
typedef struct student Node;
int studentinit(Node **l)
{
(*l) = (Node *)malloc(sizeof(Node) * 1);
if(l == NULL)
{
return FAILURE;
}
(*l)->next = NULL;
return SUCCESS;
}
void welcome()
{
system("clear");
printf("*****************************\n");
printf(red"欢迎来到帅哥的通讯录..........\n"none);
}
void menu()
{
printf("\n\n\n**********************\n");
printf(purple"1、添加信息"" " blue "2、查看信息\n"none);
printf(cyan "3、查找信息"" " red "4、删除信息\n"none);
printf(yellow"5、修改信息"" " brown "6、排序\n"none);
printf(white "7、退出 \n"none);
printf("******************************\n");
}
void addinfo(Node *s)
{
Node *p = s;
if(s == NULL)
{
printf("LINK IS ERROR!\n");
}
printf(cyan"请录入联系人的信息\n"none);
while(1)
{
while(p->next)
{
p = p->next;
}
Node *q;
q = (Node *)malloc(sizeof(Node) * 1);
scanf("%s%s",q->name, q->num);
p->next = q;
q->next = NULL;
getchar();
if(getchar() == '\n')
break;
}
system("clear");
}
void see(Node *s)
{
if(s == NULL)
{
printf("LINK IS ERROR!\n");
}
Node *q = s;
while(q ->next != NULL)
{
q = q->next;
printf(blue"name:%s num:%s\n"none,q->name, q->num);
}
}
void find(Node *a)
{
if(a == NULL)
{
printf("LINK IS ERROR!\n");
}
Node *q = a;
int h;
printf(brown"想查找的人或者想查找的信息:\n"none);
scanf("%d",&h);
switch(h)
{
case 0:
printf(yellow"请输入要查找的人名:\n"none);
char *p;
p = (char *)malloc(sizeof(char) * 64);
scanf("%s",p);
while(q->next != NULL)
{
q = q->next;
if(strcmp(p, q->name) == 0)
{
printf(cyan"name:%s num:%s\n"none,q->name, q->num);
break;
}
if(q->next == NULL)
{
printf(red"查无此人!\n"none);
}
}
free(p);
break;
case 1:
printf(red"请输入要查找的电话号码:\n"none);
char *k;
k = (char *)malloc(sizeof(char) * 64);
scanf("%s",k);
while(q->next != NULL)
{
q = q->next;
if(k == q->num)
{
printf(cyan"name:%s num:%s\n"none,q->name, q->num);
break;
}
if(q->next == NULL)
{
printf(red"查无此人!\n"none);
}
}
break;
}
}
void delete(Node *a)
{
if(a == NULL)
{
printf("LINK IS ERROR!\n");
}
printf(purple"请输入想删除的人的名字:\n"none);
char *p;
int n = 0, k = 1;
//struct student *s;
//s = (struct student *)malloc(sizeof(struct student));
p = (char *)malloc(sizeof(char) * 64);
scanf("%s",p);
Node *q = a;
Node *m = a;
Node *t;
while(q->next != NULL)
{
q = q->next;
n++;
if(strcmp(p, q->name) == 0)
{
t = q;
break;
}
}
while(k < n && m != NULL)
{
m = m->next;
k++;
}
m->next = t->next;
free(p);
}
void change(Node *s)
{
Node *q = s;
printf(brown"请输入想修改的人的名字:\n"none);
char *p;
p = (char *)malloc(sizeof(char) * 64);
scanf("%s",p);
char *v;
v = (char *)malloc(sizeof(char) * 64);
while( q->next != NULL)
{
q = q->next;
if(strcmp(p, q->name) == 0)
{
printf(yellow"请输入想修改后的号码:\n"none);
scanf("%s",v);
strcpy (q->num, v);
}
}
free(p);
}
void sort(Node *a)
{
Node *s = a; //s指向排序后节点
int k = 0, i = 0;
Node *m = s->next->next, *p, *x ; //m指向剩下结点,从第二个结点开始
s->next->next = NULL; //从第一个结点开始断开
while(m)
{
p = m;//p是要排序的节点
m = m->next;
x = a; //当x遍历到需要插入的位置时,下一次循环要从头开始
Node *n = s->next;//n是有序表节点
if(strcmp(p->name, n->name) < 0)
{
p->next = s->next;
s->next = p;
}
else
{
while(n != NULL && strcmp(p->name, n->name) > 0)
{
n = n->next;
i++;
}
while(k < i )
{
x = x->next;
k++;
}
p->next = x->next;
x->next = p;
}
}
}
int main()
{
Node *stu = NULL;
int choice, ret;
ret = studentinit(&stu);
if(ret == SUCCESS)
{
printf("init success!\n");
}
else
{
printf("init failure!\n");
}
system("clear");
welcome();
while(1)
{
menu();
scanf("%d",&choice);
switch(choice)
{
case 1:
addinfo(stu);
break;
case 2:
see(stu);
break;
case 3:
find(stu);
break;
case 4:
delete(stu);
break;
case 5:
change(stu);
break;
case 6:
sort(stu);
break;
case 7:
exit(0);
break;
}
}
return 0;
}