单向链表标准写法(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);

}
时间: 2024-07-30 13:23:24

单向链表标准写法(C格式)的相关文章

Linus:利用二级指针删除单向链表

感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图) Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding. 下面是Linus的教学原文及翻译-- "At the opposite end of the spectrum, I actually wish more people under

利用二级指针删除单向链表——笔记

今天看到这篇Linus:利用二级指针删除单向链表,作个笔记. 关于在单向链表中删除一个指定的节点,通常有两个易错点. 找到指定节点删除时,忘了备份这个节点里指向下一个节点的指针. 没有特殊处理删除第一个节点的情况.   01 //通常的写法 02 typedef struct node 03 { 04     struct node * next; 05     .... 06 } node; 07    08 typedef bool (* remove_fn)(node const * v)

网站title keywords和description标准写法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 大家好,花花在这里有礼了,今天发第一篇原创型文章,以后会陆续更新的. 第一天我们说一下SEO的一个入门知识,标准的网站title.keywords.description写法. 一.title keywords description的作用 title,也就是标题,他显示在浏览器上框,一般方便用户了解这个页面的内容,而在搜索引擎来说,这里就是

Java中单向链表的实现:增删查改功能

写一个大家都比较熟悉的数据结构:单向链表. 不过先告诉大家一个小秘密,java的API里面已经提供了单向链表的类,大家可以直接拿来用,不过学习数据结构课程的时候想必大家也已经知道,虽然系统会给我们提供一些常用的数据结构,但是自定义的总是能够带来不同的喜感的,而且通过自己的编写也更能够让我们了解其中实现的过程,而且我们还可以写一些比较个性化的方法作为属于自己的数据结构.这里主要是介绍一些常用结构里面都会用到的方法,以及链表具体是如何操作的. 首先,单链表相对于队列的优势在于存储地址不是连续的,这样

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

单向链表的方法优化

前几天写了一篇关于单向链表的实现方法,单向链表的具体实现在里面都有说明,见博客:http://cq520.iteye.com/blog/1853186 不过细心的朋友也许发现了,上次写的几个方法其实是存在漏洞的,插入方法与删除方法都不能操作第一个元素,而实际上操作第一个元素的方法与操作其他元素的方法是一样的,只是代码描叙上有些差异,原因在于:首结点不存在前结点对它的引用 优化之后的代码如下: Java代码 /** * 向链表中插入新元素的方法 * @param index 插入的位置 * @pa

单向链表的翻转

单向链表翻转,之前把这个问题想的太简单了,以为只要把数据域翻转过来就可以了,结果是筐了大瓢,下面举一个简单的例子说明: 假设有n个人站成一排,现在要把这n个人的站的顺序颠倒过来,那么就不能只把这n个人的身高颠倒过来,而是要把每一个人的位置颠倒过来,第一个人站到最后,第二个人站倒数第二,以此类推. 为了检验程序的正确性,这一次我们打印时不能再打印结点数据,而要打印结点.Java程序运行时,JVM为程序开辟了内存空间,每一个结点在栈中都有一个保存的位置,要注意的是,每次程序运行时某一个结点在内存中保

C#如何实现单向链表

链表是一种重要的数据结构,该结构由节点组成.每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一个节点的指针.对于单向链表,链表中存在两个特殊的节点,分别为"头节点"和"尾节点".头节点本身没有数据,只存储下一个节点的指针,尾节点只存储数据.结点的定义及对线性表的操作如下: 首先,定义一个结点类用于对结点的描述.其中,私有成员Value用于储存节点本身的数据,Next用于存储下一个节点的指针,Previous用于存储上一个节点的指针.对于链表的操作,

如何使用递归和非递归方式反转单向链表

以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下   问题: 给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node {  char value;  Node next; } 因 为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新