单向链表标准写法(C格式)

/************************************
*
*			Include File
*
*************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/************************************
*
*			Data Definitions
*
*************************************/

struct Node
{
	char* City;
	int 	Temp;	
	struct Node* Next;  
};

typedef struct Node* Link;

Link Head = NULL;

int NodeCount = 0;

/************************************
*
*			Functions Declarations
*
*************************************/

/** Initialize List **/
void CreateList(void);

/** Add Node **/
int AddNodeAscend(Link);

/**Delete Node **/
int DeleteNode(Link);

/** Free Node **/
void FreeNode(Link);

/** Handle Duplication Node **/
int DuplicationNode(Link,Link);

/** Show List Of Nodes **/
void ShowNode(void);

/** Compare Two Node**/
int NodeCmp(Link,Link);


/************************************
*
*			Functions Definitions
*
*************************************/


int 
AddNodeAscend(
Link to_add)
{
	Link pn, 		/* local copy of node to be add */
		prev,	/* points to previous node */
		curr;	/* points to node being examined */

	struct Node dummy;
	int 	i ;

	pn = (Link)malloc(sizeof(struct Node));
	if(pn == NULL)
		return 0;

	memcpy(pn,to_add,sizeof(struct Node));

	dummy.Next =Head;

	prev= &dummy;

	curr = Head;

	for(;;prev = curr,curr= curr->Next)
	{
		if(curr = NULL) break;
		i = NodeCmp(pn, curr);
		if(i <= 0) break;
	}

	if(curr && i == 0)
		if(DuplicationNode(curr, pn))
		return(1);
		
	prev->Next = pn;

	pn->Next = curr;

	Head = dummy.Next;
	NodeCount += 1;
	return(1);
}



int 
DuplicationNode(
Link inlist, 
Link duplication)
{
	FreeNode(duplication);

	return (0);
}


int
DeleteNode(
Link to_delete)
{
	Link curr,
		prev;

	int   i ;
	
	if(Head = NULL)
	return(0);

	for( prev = NULL,curr = Head;
		curr != NULL &&(i = NodeCmp(to_delete, curr))>0;
		prev = curr,curr = curr->Next);

	if(curr !=NULL && i==0)
	{
		if(prev)
			prev->Next = curr->Next;
		else
			Head = curr->Next;

		FreeNode(curr);

		NodeCount -= 1;

		return(1);
	}
	return(0);

}




int 
NodeCmp(
Link a, 
Link b)
{

	if(a->Temp != b->Temp)
		return (a->Temp - b->Temp);

	return strcmp(a->City,b->City);
}



void 
CreateList(
void)
{
	Head = NULL;
	NodeCount = 0;
}



void
FreeNode(
Link n)
{
	free(n->City);
	free(n);
}

void
ShowNode(
void)
{
	Link pn;

	int count,median;

	for(count = 0,pn = Head;pn;pn = pn->Next)
		count += 1;

	median = count /2 + 1;

	if(count)
	{
		count = 0;

		for(pn = Head ;pn;pn = pn->Next)
		{
			printf("%-20s : %3d " ,pn->City,pn->Temp);
			count += 1;
			if(count == median)
				printf(" -----Midian ------");

			printf("\n");
		}
	}
	else
		printf("Empty List !\n");

}


int 
main(
int argc,
char* argv[])
{
	FILE* fin;
	char buffer[128];

	struct Node n;

	if(argc != 2)
	{
		fprintf(stderr ,"Usage : citytemp filename .ext \n ");

		exit(EXIT_FAILURE);
	}

	fin = fopen(argv[1],"rt");
	if(fin == NULL)
	{
		fprintf(stderr ,"Cann't open file %s\n  ",argv[2]);

		exit(EXIT_FAILURE);
	}
	
	CreateList();

	while(!feof(fin))
	{
		if(fgets(buffer,127,fin) == NULL) break;

		buffer[strlen(buffer) -1] = '\0';

		n.City = strdup(buffer + 3);

		buffer[3] = '\0';

		n.Temp = atoi(buffer);

		if(AddNodeAscend(&n) == 0)
		{
			fprintf(stderr ," Error adding node . Aborting !\n");

			exit(EXIT_FAILURE);
		}
	}

	ShowNode();

	printf("\n");

	DeleteNode(Head);

	ShowNode();

	while(Head &&Head ->Next)
	{
		printf("\n");
		DeleteNode(Head ->Next);
		ShowNode();
	}
		
	printf("\n");

	DeleteNode(Head);

	ShowNode();

	fclose(fin);

	return (EXIT_SUCCESS);

}

上一篇:C++基础知识之--- namespace


下一篇:Linux进程及进程通讯