通讯录 带头结点的单链表实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct head_node
{
char name[30];
char num[11];
struct head_node * next;
};
typedef struct head_node Hnode;
typedef struct head_node * Hlink;
void is_malloc_ok(Hlink node)
{
if (node == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}
void create_node(Hlink * node)
{
*node = (Hlink)malloc(sizeof(Hnode));
is_malloc_ok(*node);
}
void create_link(Hlink * head)
{
create_node(head);
(*head)->next = NULL;
}
void insert_node_head(Hlink head,Hlink new_node)
{
new_node->next = head->next;
head->next = new_node;
}
void display_link(Hlink head)
{
Hlink p;
if (head == NULL)
{
printf("link dont exit!\n");
return;
}
p = head->next;
if ((head->next) == NULL)
{
printf("list is empty!\n");
return;
}
while (p != NULL)
{
printf("name : %s\n",p->name);
printf("number : %s\n",p->num);
p = p->next;
}
}
void insert_node_tail(Hlink head, Hlink new_node)
{
Hlink p;
p = head;
while (p->next != NULL)
{
p = p->next;
}
new_node->next = NULL;
p->next = new_node;
}
void free_link(Hlink head)
{
Hlink p;
p = head->next;
while(head->next != NULL)
{
head->next = p->next;
free(p);
p = head->next;
}
}
void release_link(Hlink *head)
{
free_link(*head);
free(*head);
*head = NULL;
}
void delete_node(Hlink head, Hlink new_node)
{
Hlink p, q;
if (!head || !new_node || !head->next)
{
puts("delete");
return;
}
p = q = head;
p = p->next;
while (p != NULL && strcmp(p->name,new_node->name))
{
q = p;
p = p->next;
}
if (p == NULL)
{
printf("NAME DONT EXIST!");
}
else
{
new_node->next = p->next;
q->next = new_node;
free(p);
free(new_node);
}
}
void search_node(Hlink head, char a[])
{
Hlink p;
p = head;
while (p != NULL && strcmp(p->name,a) && strcmp(p->num,a))
{
p = p->next;
}
if (p == NULL)
{
printf("CANT FIND!\n");
return;
}
else
{
printf("name : %s\n",p->name);
printf("number : %s\n",p->num);
}
}
void change_node(Hlink head, Hlink new_node)
{
Hlink p, q;
if (!head || !new_node || !head->next)
{
puts("change");
return;
}
p = q = head;
p = p->next;
while (p != NULL && strcmp(p->name,new_node->name))
{
q = p;
p = p->next;
}
if (p == NULL)
{
printf("NAME DONT EXIST!\n");
}
else
{
new_node->next = p->next;
q->next = new_node;
free(p);
}
}
void title()
{
system("clear");
printf("*********************************************\n");
printf("----------------ADDRESS LIST-----------------\n");
printf("----------------------------------------1.ADD\n");
printf("-------------------------------------2.DELETE\n");
printf("-------------------------------------3.SEARCH\n");
printf("-------------------------------------4.CHANGE\n");
printf("------------------------------------5.DISPLAY\n");
printf("---------------------------------6.EMPTY LIST\n");
printf("---------------------------------------0.EXIT\n");
printf("-----------------<WELCOME>-------------------\n");
printf("*********************************************\n");
}
int main()
{
title();
Hlink head;
Hlink new_node;
int i,loc,m=1;
char a[40];
create_link(&head);
while(m)
{
title();
printf("Please chose :\n");
printf(">>>");
scanf("%d",&m);
switch (m)
{
case 1:
system("clear");
create_node(&new_node);
printf("Please input name :\n");
scanf("%s",&new_node->name);
printf("Please input number :\n");
scanf("%s",&new_node->num);
insert_node_tail(head,new_node);
break;
case 2:
system("clear");
create_node(&new_node);
printf("Please input name :\n");
scanf("%s",&new_node->name);
delete_node(head, new_node);
break;
case 3:
system("clear");
printf("Please input name or number :\n");
scanf("%s",a);
search_node(head, a);
break;
case 4:
system("clear");
create_node(&new_node);
printf("Please rewrite name :\n");
scanf("%s",&new_node->name);
printf("Please rewrite number :\n");
scanf("%s",&new_node->num);
change_node(head, new_node);
break;
case 5:
system("clear");
display_link(head);
break;
case 6:
system("clear");
free_link(head);
break;
case 0:
release_link(&head);
m = 0;
break;
}
if (m == 0)
{
system("clear");
printf("****** ******************** ********\n");
printf("**** *********** ****\n");
printf("*** ****** **\n");
printf("** *** **\n");
printf("* *\n");
printf("* *\n");
printf("* MADE BY ZHOUYANAN *\n");
printf("** *\n");
printf("*** *****\n");
printf("******* ********\n");
printf("*********** **************\n");
printf("***************** ********************\n");
printf("******************** ***********************\n");
printf(">>>Input 'q' to say goodbye! Thanks for using!\n");
while (getchar() != 'q');
break;
}
printf(">>>Input 'q' to menu\n");
while (getchar() != 'q');
}
return 0;
}