//实现通讯录结点的输出*/
LinkList CreateList(void) //尾插法建立带头结点的通讯录链表算法
{
LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点
ListNode *p,*rear;
char flag='y'; //结束标志置y
rear=head; //尾指针初始指向头结点
while (flag=='y')
{
p=(ListNode *)malloc(sizeof(ListNode)); //申新结点
printf("编号 姓名 性别 电话 地址 \n");
printf("-----------------------------------------------\n");
printf("输入的编号:\n");
scanf("%s",p->data.number);
printf("输入的姓名:\n");
scanf("%s",p->data.name);
printf("输入性别:\n");
scanf("%s",p->data.sex);
printf("输入电话:\n");
scanf("%s",p->data.telephone);
printf("输入地址:\n");
scanf("%s",p->data.address);
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾指针指向新结点
printf("继续建表?(y/n):");
scanf("%s",&flag);
}
rear->next=NULL; //终端结点指针置空
return head; //返回链表头指针
}
void InsertNode(LinkList head,ListNode *p)//在通讯录链表head中插入结点
{
ListNode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.number,p->data.number)<0)
{
p1=p2; //p1指向刚访问过的结点
p2=p2->next; //p2指向表的下一个结点
}
p1->next=p; //插入p所指向的结点
p->next=p2; //连接表中剩余的结点
}
//新增通信录排序模块,排序比较简单,通过不断比较,结点指针相互赋值交换解决
void OrderList(ListNode *&l)//按编号排序,调用插入函数之后才可以排序
{
ListNode *p,*q,*s;
q=head;
p=q->next->next;
q->next->next=NULL;
while(p)
{
while(q->next&&(strcmp(p->data.number,q->next->data.number)>0))//比较字符串
q=q->next;
s=p->next;
p->next=q->next;
q->next=p;
p=s;
q=head;
}
}
ListNode *ListFind(LinkList head) //有序通讯录链表的查找
{
ListNode *p;
char number[10];
char name[20];
char t;
printf("----------------\n");
printf(" 1. 按编号 \n");
printf(" 2. 按姓名 \n");
printf("----------------\n");
printf("请 选 择1/2: ");
p=head->next; //假定通讯录表带有结点
scanf("%d",&t);
if (t==1)
{
printf("请输入所求的编号:");
scanf("%s",number);
while(p && strcmp(p->data.number,number)<0)//优化的地方
p=p->next;
if(p==NULL || strcmp(p->data.number,number)>0)
p=NULL; //没有查到要查找的通讯者
}
else
if (t==2)
{
printf(" 请输入要求的姓名:");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void DeleteNode(LinkList head) //通