单链表实现通讯录:
头文件部分:
#ifndef _LINKADDRESTLIST_H
#define _LINKADDRESTLIST_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);
void welcome();
void menu();
void addinfo(Node *s);
void see(Node *s);
void find(Node *a);
void delete(Node *a);
void change(Node *s);
void sort(Node *a);
#endif
调用函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Linkaddresslist.h"
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;
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(t);
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;
}
}
}
主函数部分:
#include "Linkaddresslist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}