C语言链表根据拼音排序插入节点
在做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("请依次输入:\n");
printf(" 编号\t姓名\n");
printf("eg 1901\tfur\n");
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("新增职工信息如下:\n\n");
printf("编号\t姓名\t性别\t出生年月\t工作年月\t学历\t职务\t工资\t住址\t\t电话\n");
printf("%s\t%s\t%s\t%s\t\t%s\t\t%s\t%s\t%s\t%s\t%s\n",
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;
}
}