定义结点类型
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int Phone;
/*****************定义结点内容********************/
typedef struct massage
{
char name[30]; //名字
char mobile_phone[11]; //手机号码
char Address[10]; //住址
char Work[10]; //工作
struct massage *next; //下一节点指针
}Node;
typedef struct massage *Single_list;
创建头结点
/*****************创建链表********************/
Status Creat_list(Single_list *Head)
{
(*Head) = (Single_list)malloc(sizeof(Node));
(*Head)->next = NULL;
return OK;
}
该函数的形参为指针的指针,所以传入的值是指向头结点指针的指针,故(*Head)就是头结点指针啦
初始化链表
/*****************初始化链表********************/
Status Add_list(Single_list Head, int num)
{
int i;
Single_list tail,new_node;
tail = Head;
for(i = 0; i < num; i++)
{
new_node = (Single_list)malloc(sizeof(Node));
printf("Please intput name: ");
gets(new_node ->name);
printf("\n");
printf("Please intput numbers of mobile_phone: ");
gets(new_node ->mobile_phone);
printf("\n");
printf("Please intput address: ");
gets(new_node ->Address);
printf("\n");
printf("Please intput work: ");
gets(new_node ->Work);
printf("\n");
Add_one_member_to_the_file(new_node);
tail ->next = new_node; //前一个节点的指针指向新的结点
tail = new_node; //让尾指针指向新的结点,为下一个新结点出现做准备
}
tail ->next = NULL;
return OK;
}
该函数的第一个是头结点的指针,第二个是需要输入结点的数目。
往链表中插入新的结点
Status Insert_list(Single_list *Head, int loca)
{
int count = 1;
Single_list temp,new_node;
if(loca < 1)
return ERROR;
temp = *Head;
while(temp && count < loca)
{
temp = temp->next;
count++;
}
if(!temp || loca < count)
return ERROR;
new_node = (Single_list)malloc(sizeof(Node));
new_node->next = temp->next; //先接后面的结点
temp->next = new_node; //再接前面的结点
printf("Please intput name: ");
gets(new_node ->name);
printf("\n");
printf("Please intput numbers of mobile_phone: ");
gets(new_node ->mobile_phone);
printf("\n");
printf("Please intput address: ");
gets(new_node ->Address);
printf("\n");
printf("Please intput work: ");
gets(new_node ->Work);
printf("\n");
return OK;
}
没什么好说的,这里选择在第loca位置之前插入。
根据名字查找某个结点的其它信息
/根据名字查找其它信息***/
Status Lookup_list(Single_list Head,char *search_name)
{
Single_list temp;
temp = Head->next; //第一个结点的地址给temp
while(temp)
{
if(strcmp(temp->name,search_name) == 0)
{
printf(“The phone is: %s\n”,temp->mobile_phone);
printf(“The Address is : %s\n”,temp->Address);
printf(“The work is: %s”,temp->Work);
}
temp = temp->next;
}
if(!temp)
return ERROR;
return OK;
}
根据名字查找并删除该结点
/*****************删除某一个结点********************/
Status Delete_list(Single_list *Head, char *Delete_name)
{
Single_list temp,delete_node;
if((*Head)->next == NULL) //判断是否为空链表
return ERROR;
delete_node = (*Head)->next; //把第一个结点给temp指针
while(strcmp(Delete_name, delete_node->name))
{
temp = delete_node;
delete_node = delete_node->next;
}
if(temp == 0) //没有找到该名称
return ERROR;
temp ->next = delete_node->next;
free(delete_node);
return OK;
}
temp记录的是要删除的前一个结点的地址。
OK! 以上就是电话本的抽象数据类型啦
还有其它功能形函数:
状态显示函数
/*****************状态显示函数********************/
void Status_report(int *param)
{
if(*param == 1)
printf("operation is success!\n");
else if(*param == 1)
printf("operation is failed!\n");
*param = 0;
}
菜单显示函数
/*****************菜单显示函数********************/
void Meun_choose(char *select)
{
printf("please input command:\n");
printf("*************************************\n");
printf("* A is insert a member! *\n");
printf("* B is looking massage by name! *\n");
printf("* C is delete a member! *\n");
printf("* D is return to the menu *\n");
printf("*************************************\n");
printf("your selection is :");
*select = getchar();
getchar();
}
备份函数
/*****************添加一个成员到文件D:\VC\MSDev98\Bin\DataAndStructure********************/
void Add_one_member_to_the_file(Single_list member)
{
FILE *fp;
if((fp = fopen("D:\\VC\\MSDev98\\Bin\\DataAndStructure\\phone.dat","ab")) == NULL)
{
printf("Cannot open file strike any key exit !\n");
getch();
exit(0);
}
fwrite(member,sizeof(Node),1,fp);
fclose(fp);
}
每个输入的信息都被文件存起来