忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表

我们至少可以通过两种结构来存储数据

数组

1.需要一整块连续的存储空间,内存中可能没有

2.插入元素,删除元素效率极低。

3.查找数据快

链表

1.查找效率低

2.不需要一块连续的内存空间

3.插入删除元素效率高

计算机术语

头指针:存放头结点地址的指针变量

头结点:

数据类型和首节点的数据类型一模一样

头结点是首节点前面的那个节点

头结点并不存放有效数据

设置头结点的目的是为了方便对链表操作

首节点:存放第一个有效数据的节点

尾节点:

存放最后一个有效数据的节点

尾节点的指针域是空的(null)

头指针---->头结点---->(首节点----->链表------>尾节点)  ()内是有效数据

只需要知道头指针就能确定一个链表(尾节点指针域是null)

2012年2月6日7:30:48

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

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

struct Node * create_list();
void traverseList(struct Node *);

int main(void){
	struct Node * pHead = NULL;  //定义头指针
	pHead = create_list();  //构造链表,返回头结点地址
	traverseList(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);
	}
	struct Node * pTail = pHead;  //将头结点的地址给指针变量pTail使pTail指向头结点
	pTail->pNext = NULL;  //头结点的结构体元素(下一个节点地址)赋值
	printf("请输入你要创建链表的节点个数:len = ");
	scanf("%d", &len);

	for(i=0; i<len; i++){
		printf("请输入第%d个节点的值:", i+1);
		scanf("%d", &val);

		//给第 i+1 个节点分配内存空间
		struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
		if(NULL == pNew){
			printf("分配失败,程序终止!\n");
			exit(-1);
		}
		//内存分配成功后
		pNew->data = val;      //新节点赋值
		pTail->pNext = pNew;   //pNew指向的地址给头结点的变量
		pNew->pNext = NULL;    //新节点地址变量给空值
		pTail = pNew;         //重新使pTai 替换 pNew进行下一次分配创建
	}
	return pHead;
}

void traverseList(struct Node * pHead){
	struct Node * p = pHead->pNext;
	while(NULL != p){
		printf("%d\n", p->data);
		p = p->pNext;
	}
	return;
}


posted on 2014-04-17 22:51  岚之山  阅读(182)  评论(0编辑  收藏  举报

导航