数据结构C语言版车牌号的查询与排序

</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">#include<stdio.h>
#define KEY_SIZE 8
#define LIST_SIZE 100
typedef struct
{
	char key[KEY_SIZE];
	char name[10];
	char carname[20];
	int next;
}RecordType;
typedef struct
{
	RecordType r[LIST_SIZE];
	int length;
	int keynum;
}SLinkList;
typedef int shuzi[10];
typedef int zimu[26];
void InitSLList(SLinkList *L)	   
{
	L->length=0;							
	L->keynum=7;
}
void Distribute_s(RecordType r[],int i,shuzi head,shuzi tail)  
{		  
	int j,p;
	for(j=0;j<=9;j++)	
	{
		head[j]=0;
		tail[j]=0;
	}
	
	p=r[0].next;
	while(p!=0)
	{	   
		j=int(r[p].key[i]-'0');
		
		if(head[j]==0)
			head[j]=p;
		else 
			r[tail[j]].next=p;
		tail[j]=p;
		p=r[p].next;
	}
}

void Distribute_z(RecordType r[],int i,zimu head,zimu tail)  
{		  
	int p,j;
	
	for(j=0;j<=25;j++)
	{
		head[j]=0;
		tail[j]=0;
	}
	
	p=r[0].next;
	while(p!=0)
	{	   
		j=int(int(r[p].key[i])-'A');
		if(head[j]==0)head[j]=p;
		else r[tail[j]].next=p;
		tail[j]=p;
		p=r[p].next;
	}
}

void Collectnumber(RecordType r[],shuzi head,shuzi tail)
{		
	int j=0,t;
	while(head[j]==0)
		++j;
	r[0].next=head[j];t=tail[j];
	while(j<9)
	{	
		++j;
		while((j<9)&&(head[j]==0))
			++j;
		if(head[j]!=0)
		{ 
			r[t].next=head[j];
			t=tail[j];
		}
	}
	r[t].next=0;
}

void Collectletter(RecordType r[],zimu head,zimu tail)	 
{		 
	int j=0,t;
	while(head[j]==0)
		++j;
	r[0].next=head[j];t=tail[j];
	while(j<25)
	{	++j;
		while((j<25)&&(head[j]==0))
			++j;
		if(head[j]!=0)
		{ 
			r[t].next=head[j];
			t=tail[j];
		}
	}
	r[t].next=0;
}

void Sort(SLinkList *l)		
{	   
	int n=l->length;
	zimu head,tail;
	shuzi heads,tails;
	for(int i=0;i<=n-1;i++)
		l->r[i].next=i+1;
	l->r[n].next=0;
	for(i=6;i>2;i--)			
	{ 
		Distribute_s(l->r,i,heads,tails);  
		Collectnumber(l->r,heads,tails);	  
	}
	Distribute_z(l->r,2,head,tail); 
	Collectletter(l->r,head,tail);		  
	for(i=1;i>=0;i--)
	{		
		Distribute_s(l->r,i,heads,tails);	   
		Collectnumber(l->r,heads,tails);	  
	}		
}

void Makeup(SLinkList *l)				
{	   
	int p,q;
	RecordType buf;
	p=l->r[0].next; 				  
	for(int i=1;i<l->length;i++)
	{	 
		while(p<i)
			p=l->r[p].next; 		 
		q=l->r[p].next;
		if(p!=i)
		{		
			buf=l->r[p];
			l->r[p]=l->r[i];
			l->r[i]=buf;				
			l->r[i].next=p; 		
		}
		p=q;
	}
}

void Iuputinfm(SLinkList *L)					
{
int x;
	int j=1;
	printf("您将输入车牌信息:\n");
	printf("例:01B1234 车牌格式为:01(两位数字)+B(大写字母)1234(四位数字)");
	printf("\n");
	printf("继续录入输入1完成录入输入0:");
	scanf("%d",&x);
	printf("\n");
	while(x)
	{	
		x=0;
		printf("\t车牌号:");
		scanf("%s",&(L->r[j].key));
			printf("\t车主名:");
			scanf("%s",&(L->r[j].name));
				printf("\t车  名:");
			scanf("%s",&(L->r[j].carname));
		printf("输入1继续录入输入0完成录入:");
		scanf("%d",&x);
		if(x)
			j++;
	}
	L->length=j;	
}

void Outputinfm(SLinkList *L)		
{	
	int i;
	printf("\t");
	printf("车牌号    车主名   车名");
	printf("\n");
	for(i=1;i<=L->length;i++)
	{	  
		printf("\t%s",L->r[i].key);
		printf("   %s" ,  (L->r[i].name));
		printf("   %s\n",L->r[i].carname);
	}
}

int Equal(char key1[],char key2[])		 
{
	for(int i=0;i<7;i++)
	{
		if(key1[i]!=key2[i]) 
			return 0;
	}
	return 1;
}

int xiao(char key1[],char key2[])		
{
	for(int i=0;i<7;i++)
	{
		if(key1[i]<key2[i])
			return 1;
		else if(key1[i]>key2[i]) return 0;
	}
	return 0;
}

int Binsrch(SLinkList *L,char s[8]) 	   
{	  
	int mid,high,low;
   low=1;
	high=L->length;
	while(low<=high)
	{	   
		mid=(high+low)/2;
		if(Equal(s,L->r[mid].key))
			return(mid);
		else if(xiao(s,L->r[mid].key))
			high=mid-1;
		else
			low=mid+1;
	}
	return(0);	
}

void noun()    
{
	printf("\t\t     ========================\n");
	printf("\t\t     ----车牌信息管理系统----   \n");
	printf("\t\t     ========================\n");
	printf("\t\t        选1-- 添加车辆信息           \n");
	printf("\t\t-------------------\n");
	printf("\t\t        选2-- 输出所有车辆信息      \n");
	printf("\t\t-------------------\n");
	printf("\t\t        选3-- 按车牌号码进行排序     \n");
	printf("\t\t-------------------\n");
	printf("\t\t        选4-- 按车牌号码查找车辆     \n");
	printf("\t\t-------------------\n");
	printf("\t\t        选0-- 退出程序               \n");
	printf("\t\t++++++++++++++++++++++++++++++++++++\n");
}

void main()
{	
	int i;
	SLinkList l;
	noun(); 	
	do
	{	
		printf("输入你选择的数字(0~4):");
		scanf("%d",&i); 	
		switch(i)
		{
		case 1:
			InitSLList(&l); 
			Iuputinfm(&l);
			break;
		case 2:
			printf("------库中车牌信息:------\n");
			Outputinfm(&l);
			break;
		case 3:
			Sort(&l);
			Makeup(&l);
			printf("------排序后的顺序为------\n");
			Outputinfm(&l);
			break;
		case 4:
			int f;
			char s[7];
			printf("----请输入要查找的车牌号码----\n");
			scanf("%s",&s);
			f=Binsrch(&l,s);
			if(f)
			{	   
				printf("\t查找的车在表中的位置为:%d\n",Binsrch(&l,s));
				printf("\t车牌号码:");
				printf("%s",l.r[f].key);
				printf("\n");
				printf("\t车主名:");
				printf("%s\n",l.r[f].name);
				printf("\t车  名:");
				printf("%s\n",l.r[f].carname);
			}
			else 
				printf("此车牌号不在列表中");
				printf("\n");
			break;
		case 0:
			break;
			
		}
			}while(i!=0);	
}	


转载于:https://www.cnblogs.com/zhuhengjie/p/5966931.html

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,对于汽车牌照数据的排序和快速查找,我们可以考虑使用C语言中的数据结构和算法来实现。 首先,对于排序,我们可以使用快速排序(Quick Sort)算法来对汽车牌照数据进行排序。快速排序是一种常用的排序算法,其时间复杂度为O(nlogn),效率较高。下面是一个基于递归实现的快速排序算法示例: ```c void quick_sort(char arr[][8], int left, int right) { if (left >= right) { return; } int i = left, j = right; char pivot[8]; strcpy(pivot, arr[left]); while (i < j) { while (i < j && strcmp(arr[j], pivot) >= 0) { j--; } strcpy(arr[i], arr[j]); while (i < j && strcmp(arr[i], pivot) <= 0) { i++; } strcpy(arr[j], arr[i]); } strcpy(arr[i], pivot); quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } ``` 以上代码中,我们使用了一个二维字符数组`arr`来存储汽车牌照数据。在快速排序算法中,我们选择了`arr`的最左边的元素作为基准元素(pivot),并将其与数组中的其他元素进行比较,将较小的元素放在基准元素的左侧,较大的元素放在右侧,最终以基准元素为界将数组分成两部分。然后再递归地对左右两部分进行排序,直到排序完成。 接下来,对于快速查找,我们可以使用二分查找(Binary Search)算法来实现。二分查找是一种常用的查找算法,其时间复杂度为O(logn),效率较高。下面是一个二分查找算法示例: ```c int binary_search(char arr[][8], int left, int right, char key[]) { if (left > right) { return -1; } int mid = (left + right) / 2; if (strcmp(arr[mid], key) == 0) { return mid; } else if (strcmp(arr[mid], key) > 0) { return binary_search(arr, left, mid - 1, key); } else { return binary_search(arr, mid + 1, right, key); } } ``` 以上代码中,我们同样使用了一个二维字符数组`arr`来存储汽车牌照数据。在二分查找算法中,我们首先确定一个中间位置(mid),将查找的关键字(key)与中间位置的元素进行比较,如果相等则返回mid。如果key小于中间位置的元素,则在左侧继续查找;如果key大于中间位置的元素,则在右侧继续查找。最终,当找到key时,返回其在数组中的下标;如果未找到,则返回-1。 综上所述,以上代码可以实现对汽车牌照数据的排序和快速查找。需要注意的是,以上示例代码并未考虑哈希表等更加高效的数据结构和算法,仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值