在做C语言课程设计的时候需求按字典排序新建职员,就是通过拼音进行排序
思路
- 创建双向链表
- 获取两个方向的节点与准备插入的节点的姓名属性做比较
- 需要注意:插入最后的话p->next = NULL,需要进行判断,否则出错
- 关键:
if( (strcmp(p->worker.name,pre->worker.name) > 0 ) && ( strcmp(p->worker.name,q->worker.name) < 0 ) )
- 以下代码为摘录,完整系统代码可以查看我的另一篇博客
C语言职工管理系统
//按拼音排序增加职工
int addWorker (Node *worker)
{
Node *p,*q,*pre;
q = pre = worker;//头结点不存储数据
if(q->next != NULL)
{
pre = q;
q = q->next;
q->prior = pre;
printf("%p",q->prior->next);
}
int j = 0;
printf("请依次输入:
");
printf(" 编号 姓名
");
printf("eg 1901 fur
");
p = (Node *)malloc(sizeof(Node));
scanf("%s%s%s%s%s%s%s%s%s%s",
p->worker.num,p->worker.name,p->worker.sex,p->worker.birthday,p->worker.workday,p->worker.edu,p->worker.job,p->worker.addr,p->worker.phone,p->worker.salary);
printf("新增职工信息如下:
");
printf("编号 姓名 性别 出生年月 工作年月 学历 职务 工资 住址 电话
");
printf("%s %s %s %s %s %s %s %s %s %s
",
p->worker.num,p->worker.name,p->worker.sex,p->worker.birthday,p->worker.workday,p->worker.edu,p->worker.job,p->worker.addr,p->worker.phone,p->worker.salary);
while(q!=NULL)
{
//判断是否在前后两个节点之间
if( (strcmp(p->worker.name,pre->worker.name) > 0 ) && ( strcmp(p->worker.name,q->worker.name) < 0 ) )
{
p->next = q;
p->prior = q->prior;
q->prior = p;
p->prior->next = p;
break;
}
//判断是否是最后一个节点,加入第二个条件,否则无论如何都会运行,因为p->next最后都是NULL
if( (q->next == NULL) && ( strcmp(p->worker.name,pre->worker.name) > 0 ))
{
printf("2....");
q->next = p;
p->prior = q;
p->next = NULL;
break;
}
//进行循环
pre = q;
q = q->next;
q->prior = pre;
}
}