小蚂蚁学习C语言(31)——C语言初识链表(下)

    写一个链表的小案例,体会一下链表的存储特色,和数组的区别,以及指针的运用方法。
数组

/*
	链表结构
	流程:
		建立结构体
		一、建立头指针,用于保存头结点的指针
		二、建立头结点,保存首节点指针
		三、动态建立链表
		四、输出
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

struct Node
{
	int data;
	struct Node * pNode;
};

//函数声明(居然忘了(ToT)/~~~)
struct Node * create_list(void);
void traverse_list(struct Node *);

int main(void)
{
	struct Node * pHead = NULL;	//定义一个头指针(NULL必须大写)
	
	pHead = create_list(); 	
	//建立一个链表,把头结点的指针传递给头指针元素保存
	
	printf("\n\n");

	traverse_list(pHead);	//输出整个链表

	return 0;	
}

struct Node * create_list(void)
{
	int len;
	int i;
	int val;
	
	//建立一个头结点
	struct Node * pHead = (struct Node *)malloc(sizeof(struct Node));
	if( NULL == pHead )
	{
		printf("头结点建立失败\n");
		exit(-1);
	}
	pHead -> pNode = NULL;
	
	/*
		为了解决在下面for循环中,每次都会把指针交给头结点保存这个问题,
		须要另外建立一个指针变量
	*/
	struct Node * pTail = pHead;
	
	
	printf("请输入链表的个数:");
	scanf("%d",&len);
	printf("\n");

	
	for(i = 0; i < len; i++)
	{
		printf("请输入第%d个元素:",i+1);
		scanf("%d",&val);
		struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
		pNew -> data = val;
		pNew -> pNode = NULL;
		
		/*
			第一次写到这里的时候,写的是 pHead -> pNode = pNew; 
			第一次循环的时候是正确的,把首结点的指针保存到了头结点
			第二次的时候就不对了,由于仍是会把第二个元素的指针保存到头结点中……
			因此,须要建立另一个,用以存放上一个元素的地址
		*/
		pTail -> pNode = pNew;
		
		/*
			将新建立的元素的地址交给pTail保存,用于存放下一个新建立的地址。
		*/
		pTail = pNew;
		
	}
	
	//将头结点的地址返回
	
	return pHead;
}

void traverse_list(struct Node * pHead)
{
	struct Node * p = pHead -> pNode;
	
	printf("输出全部链表元素:");

	while( NULL != p)
	{
		printf("%d ", p -> data);
		
		p = p -> pNode;
		//写到这里我好像理解了“头结点的目的是为了方便对链表的操做”这句话的含义
	}
	
	printf("\n");
}
/*
	VC++6.0 输出的结果是:
	====================================
	请输入链表的个数:3

	请输入第1个元素:1
	请输入第2个元素:2
	请输入第3个元素:3


	输出全部链表元素:1 2 3
	====================================
	遇到的错误:
		1,NULL必需要大写 (╯▽╰)
		2,忘了写函数的前置声明
	
*/


学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog函数

相关文章
相关标签/搜索