天天看点

C语言学习笔记(13)——链表

链表

算法:

1.通俗定义:

解题的方法和步骤

2.狭义定义:

对存储数据的操作  

3.广义定义:

广义的算法也叫泛型

无论数据是如何存储的,对数据的操作都是一样的

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

数组

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

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

3.查找数据快

链表

1.查找效率低

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

2.插入删除元素效率高

专业术语

头指针

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

头结点

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

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

头结点并不存放有效数据

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

首节点

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

尾节点

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

尾节点的指针域是空的(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;

}

继续阅读