我们至少可以通过两种结构来存储数据
数组
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("分配失败,程序终止! "); 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("分配失败,程序终止! "); 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 ", p->data); p = p->pNext; } return; }