http://blog.csdn.net/Hugohut/archive/2009/04/11/4065216.aspx
花了两个晚上的时间写了一个通讯录的程序,代码如下,希望有高手指点指点。。。
运行环境:Visual C++ 6.0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char num[5];
char name[9];
char sex[3];
char phone[13];
char addr[31];
}DataType;
typedef struct node{
DataType data;
struct node *next;
}ListNode;
typedef ListNode *LinkList;
LinkList head;
ListNode *p;
//*函数说明*//
int menu_select();
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode * ListFind(LinkList head);
void DelNode(LinkList head);
void PrintfList(LinkList head);
void main()
{
for( ; ; ){
switch(menu_select())
{
case 1:
printf("**********************************/n");
printf("******通讯录链表的建立***********/n");
printf("**********************************/n");
head=CreateList( );
break;
case 2:
printf("**********************************/n");
printf("*******通讯者信息的添加**********/n");
printf(" 编号(4) 姓名(8) 性别 电话(11) 地址(31)/n");
printf("**********************************/n");
p=(ListNode*)malloc(sizeof(ListNode));
scanf("%S%S%S%S%S",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
InsertNode(head,p);
break;
case 3:
printf("**********************************/n");
printf("*******通讯者信息的查询**********/n");
printf("**********************************/n");
p=ListFind(head);
if(p!=NULL){
printf(" 编号 姓名 性别 电话 地址 /n");
printf("**********************************/n");
printf("%S%S%S%S%S",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
printf("**********************************/n");
}
else
printf("没有查到要查询的通讯录!/n");
break;
case 4:
printf("**********************************/n");
printf("*******通讯者信息的删除**********/n");
printf("**********************************/n");
DelNode(head);
break;
case 5:
printf("**********************************/n");
printf("*******通讯者信息的输出**********/n");
printf("**********************************/n");
PrintfList(head);
break;
case 0:
printf("/t Good Bye!/n");
return;
}
}
}
int menu_select()
{
int sn;
printf("通讯录管理系统/n");
printf("==============/n");
printf(" 1.通讯录链表的建立 /n");
printf(" 2.通讯录的结点的插入/n");
printf(" 3.通讯录的结点的删除/n");
printf(" 4.通讯录的结点的查询/n");
printf(" 5.通讯录的链表的输出/n");
printf("================/n");
printf("请选择0-----5:");
for(; ;)
{
scanf("%d",&sn);
if(sn<0||sn>5)
printf("/n/t输入错误,重选0---5:");
else
break;
}
return sn;
}
LinkList CreateList(void)
{
LinkList head=(ListNode*)malloc(sizeof(ListNode));//*申请头结点*//
ListNode *p,*rear;
int flag=0;//*结束标志置0*//
rear=head;
while(flag==0)
{p=(ListNode *)malloc(sizeof(ListNode));//*申请新结点*//
printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)/n");
scanf("%S%S%S%S%S",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
rear->next=p;//*新结点链接到未结点之后*//
rear=p;//*未指针初始指向新结点*//
printf("继续输入吗?(1/0):");
scanf("%d,&flag");
}
rear->next=NULL;
return head;
}
void InsertNode(LinkList head,ListNode *p)
{
ListNode *p1,*p2;
p1=head;
p2=p1->next;
while(p2=NULL && strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;
p2=p2->next;
}
p1->next=p;
p->next=p2;
}
//*在有序通讯录链表上的查找*//
ListNode * ListFind(LinkList head)
{
ListNode *p;
char num[5];
char name[9];
int xz;
printf("=============/n");
printf("1.按编号查询 /n");
printf("2.按姓名查询 /n");
printf("=============/n");
printf("请选择: /n");
p=head->next;
scanf("%d","xz");
if(xz=1){
printf("请输入要查找的标号:/n");
scanf("%s",num);
while(p && strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL || strcmp(p->data.num,num)>0)
p=NULL;
}
else
if(xz==2){
printf("请输入查找者的名字:");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void DelNode(LinkList head)
{
char jx;
ListNode *p,*q;
p=ListFind(head);
if(p==NULL)
{
printf("没有查到要删除的通讯录/n");
return;
}
printf("真的要删除节点吗?(y/n):");
scanf("%c",&jx);
if(jx=='y'||jx=='Y'){
q=head;
while(q!=NULL && q->next!=p)
q=q->next;
q->next=p->next;
free(p);
printf("通讯者已经被删除!/n");
}
}
void PrintfList(LinkList head)
{
ListNode *p;
p=head->next;
printf("编号 姓 名 性别 联系电话 地址/n");
printf("---------------------------------------/n");
while(p!=NULL)
{
printf("%s,%s,%s,%s,%s/n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
printf("-----------------------------------/n");
p=p->next;
}
}