数组和链表的区别
1.数组:
1.数组是有限个元素的集合
2.数组的空间必须连续
3.数组的插入和删除效率低
2.链表:
1.链表空间不需要连续
2.链表元素个数没有上限
3.链表存储空间变大
4.单向链表、双向链表、内核链表、循环链表
5.插入和删除效率很高
链表
链表节点分为两个域
数据域:存放各种实际的数据data
指针域:存放下一节点的首地址 pnext
最后一个节点的指针域为NULL
链表的节点类型
/* 链表节点类型 */
typedef struct node
{
int data; //数据域
struct node *pnext; //地址域(下一个节点的地址)
}LinkNode;
创建一个空的单向有头链表
/******************************************
*函数名:CreateLinkList
*功 能:
* 创建一个空单向有头链表
*参 数:
* 缺省
*返回值:
* 成功返回头结点地址
* 失败返回NULL
*注意事项:
*
******************************************/
LinkNode *CreateLinkList(void)
{
LinkNode *pTmpNode = NULL;
//1.申请空间
pTmpNode = malloc(sizeof(LinkNode));
if (NULL == pTmpNode)
{
return NULL;
}
//2.对每个成员赋初值
pTmpNode->pnext = NULL;
return pTmpNode;
}
链表插入元素(头插法)
/******************************************
*函数名:InsertHeadLinkList
*功 能:
* 单向链表头插法插入元素
*参 数:
* phead:链表头结点地址
* tmpdata:插入数据
*返回值:
* 成功返回0
* 失败返回-1
*注意事项:
*
******************************************/
int InsertHeadLinkList(LinkNode *phead, int tmpdata)
{
LinkNode *pTmpNode = NULL;
//1.申请存放数据的空间
pTmpNode = malloc(sizeof(LinkNode));
if (NULL == pTmpNode)
{
return -1;
}
//2.数据存进去
pTmpNode->data = tmpdata;
//3.地址域赋值为空白节点的pnext
pTmpNode->pnext = phead->pnext;
//4.空白节点的pnext指向新申请节点
phead->pnext = pTmpNode;
return 0;
}
遍历链表所有节点
(定义一个新的指针指向头结点,从头结点开始向后遍历,只要p!=NULL,p就等于p->pnext)
/******************************************
*函数名:ShowLinkList
*功 能:
* 打印链表中所有节点的数据
*参 数:
* phead:链表头结点地址
*返回值:
* 缺省
*注意事项:
*
******************************************/
void ShowLinkList(LinkNode *phead)
{
LinkNode *p = NULL;
p = phead->pnext;
while (p != NULL)
{
printf("%d ", p->data);
p = p->pnext;
}
printf("\n");
return;
}