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("请依次输入:\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;
	}		 	
}

posted on 2019-10-13 22:22  furfur-jiang  阅读(319)  评论(0编辑  收藏  举报