C语言链表根据拼音排序插入节点

在做C语言课程设计的时候需求按字典排序新建职员,就是通过拼音进行排序
思路

  1. 创建双向链表
  2. 获取两个方向的节点与准备插入的节点的姓名属性做比较
  3. 需要注意:插入最后的话p->next = NULL,需要进行判断,否则出错
  4. 关键:if( (strcmp(p->worker.name,pre->worker.name) > 0 ) && ( strcmp(p->worker.name,q->worker.name) < 0 ) )
  5. 以下代码为摘录,完整系统代码可以查看我的另一篇博客
    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;
	}		 	
}

原文地址:https://www.cnblogs.com/furfur-jiang/p/12238743.html