#include <stdio.h>
#include <malloc.h>
#include <string.h>

//برنامج الانتخاب


//تركيبة القائمة المتصلة

//////////////////////////////
struct  Node             /////			   
{						 /////	
	char string[80];			 /////	
	struct Node *next;   /////   
};						 /////
//////////////////////////////


// تعريف مؤشر الى العقدة واستخدامه في تعريف بقية المؤشرات الى القائمة

/////////////////////////////
typedef struct Node * PTR; //
/////////////////////////////

//الدوال اعمليات على القائمة

///////////////********************/////////////////////////////////////////////////
///                                                                               //
PTR   Getnode();						 //دالة انشاء عقدة                        //
void  AddEndList( PTR list, char str[80] );  //دالة انشاء عقدة من  اخر القائمة			  //
void  PrintList( PTR  list );		 //دالة طباعة القيم التي في  القائمة كلها     //
void  SerchingSorting( PTR list );                   

///																				  //																			
///////////////********************/////////////////////////////////////////////////



int main()
{
	PTR  list = NULL;
	char str[80];
	int n;

	printf("How Many Enter Name \n Enter n =  ");
	scanf("%d",&n);

	printf("Enter Name : ");
	scanf("%s",str);

	list = Getnode();
	strcpy(list->string , str);
	list->next = NULL;


	for( int i=1; i<n; i++ )
	{
		printf("Enter Name : ");
		scanf("%s",str);
		AddEndList(list,str);
	}
	
	SerchingSorting(list);
	PrintList(list);
	printf("\n\n\n");


	return  0;
}



//جسم دالة انشاء عقدة
PTR  Getnode()
{
	PTR p = (PTR)malloc( sizeof(struct Node) );

	return  p;
}


//دالة اضافة حلقة للقائمة من عند اخر القائمة
void  AddEndList( PTR list, char str[80])
{
		PTR p = list;

		while( p->next != NULL )
			p = p->next;

		PTR q = Getnode();
		strcpy(q->string,str);
		p->next = q;
		q->next = NULL;

}



//دالة طباعة قيم العقد التي في القائمة
void PrintList( PTR  list )
{
	PTR p = list;

	while( p != NULL )
	{
		printf("\n\t%s",p->string);
		p = p->next;
	}	
}

// دالة الترتيب تصاعدي وللترتيب تنازلي غير الاشارة من اكبر من الى اصغر من في شرط داخل الدالة 
void  SerchingSorting( PTR list )
{
	PTR p = list;
	PTR temp;

	while( p->next != NULL )
	{
		if( strcmp(  p->string , p->next->string  ) > 0 )
		{
			temp = Getnode(); //انشء كيان مؤقت
			//القيام بعمليات التبديل في القائمة المتصلة
			strcpy(temp->string,p->string);
			strcpy(p->string,p->next->string);
			strcpy(p->next->string,temp->string);	
			temp->next = NULL;
			//حذف الكيان المؤقت وتهيئته بالصفر
			free(temp);
			temp = 0;
					
		}		
		
		p = p->next;
	}

}