一、链表的概念
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束,以下为一个简单的链表结构:
图中,第0个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。
实例如下:
#include<stdio.h>
typedef int DATA;
//#define DATA int;两种不同别名方式
struct sNode
{
DATA data;
sNode* pNext;
};
sNode*g_pHead = NULL;//头指针
int main()
{
return 0;
}
其中DATA data属于数据域,Snode* pNext属于指针域。
二、链表的特征
a)链表必须有链表头pHeader;
b)通过表头可以依次进行插入、删除等操作;
c)如果是空链表,则表头pHeader=NULL;
d)链表表尾,类似与null结尾字符,最后一个节点的指针pNext=0。
三、单向链表的创建
#include<stdio.h>
#include<malloc.h>
typedef int DATA;
//#define DATA int;两种不同别名方式
struct sNode
{
DATA data;
sNode* pNext;
};
sNode*g_pHead = NULL;//头指针
//链表的插入--头插入
void AddHead(DATA data)//头插法:每次插入都从头插入
{
sNode* p = (sNode*)malloc(sizeof(sNode));
p->data = data;
p->pNext = g_pHead;
g_pHead = p;
}
//链表的插入--尾插入
void AddTail(DATA data)
{
sNode* pNew = (sNode*)malloc(sizeof(sNode));
pNew->data = data;
pNew->pNext = NULL;
if (!g_pHead)
{
g_pHead = pNew;
return;
}
sNode* p = g_pHead;
while (p->pNext != NULL)
p = p->pNext;
p->pNext = pNew;
}
void Print()
{
sNode*p = g_pHead;
while (p != NULL)
{
printf("%d", p->data);
p = p->pNext;
}
}
int main()
{
puts("头插法");
AddHead(1);
AddHead(2);
AddHead(3);
Print();
printf("\n");
puts("尾插法");
AddTail(100);
AddTail(200);
AddTail(300);
Print();
return 0;
}