一、数组与链表的比较
数组:
优点:存取速度快
缺点:需要一个连续的很大的内心
缺点:需要一个连续的很大的内心
插入和删除元素的效率很低
链表:
不需要一个连续的很大的内存
缺点:查找某个位置的元素效率低
二、链表的结构
首节点:存放第一个有效数据的节点
尾节点:存放最后一个有效数据的节点
头结点:头结点的数据类型和首节点的类型是一样的
头结点并不存放有效数据
头结点是首节点前面的那个节点
设置头结点的目的是为了对链表的操作
头指针:存放头结点地址的指针变量
确定一个链表只需要一个参数:只需要头指针。
/*
2016年9月11日17:10:57
链表
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h> //用exit函数需要此声明
struct Node
{
int data; //数据域
struct Node * pNext; //指针域
};
//函数声明
struct Node * creat_list();
void traverse_list(struct Node * pHead);
int main(void)
{
struct Node * pHead = NULL;
pHead = creat_list(); //创建新链表
traverse_list(pHead); //遍历整个链表并将数据域的内容输出
return 0;
}
struct Node * creat_list()
{
int len; //有效字节的个数
int val; //用来临时存放用户输入字节的值
int i;
struct Node * pHead = NULL;
pHead = (struct Node *) malloc(sizeof(struct Node)); //分配了一个不存放有效数据的头结点
if(NULL == pHead)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
//pHead->pNext = NULL;
struct Node * pTail = pHead;
pTail->pNext = NULL;
printf("请输入要创建链表的个数:");
printf("len = ");
scanf("%d", &len);
for(i = 0; i < len; ++i)
{
struct Node * pNew = NULL;
pNew = (struct Node *) malloc(sizeof(struct Node));
if(NULL == pNew)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
printf("请输入第%d个链表的值:", i+1);
scanf("%d", &val);
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(struct Node * pHead)
{
struct Node * p = pHead->pNext;
while(NULL != p)
{
printf("%d\n", p->data);
p = p->pNext;
}
return;
}

浙公网安备 33010602011771号