单向链表:是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。每个节点的指针域指向下一个节点,head头指针指向头节点,尾节点指针指向NULL
单向链表的定义
typedef struct node
{
int data; //数据域,假设为int型数据
struct node* next;// 指向下一个节点的指针
}linkNode,*linkP; //linkP指向节点的指针
// 链表的创建
void CreateList(linkP* H)
{
int i = 1;
int a;//数据域
linkP P,r;
r = H; // r为头结点的复制,H头结点用于遍历,r用于新节点的复制
printf("请输入链表第%d个元素:", i);
scanf("%d",&a);
while(a != -1)//a==-1表示输入结束
{
P = (linkP)malloc(sizeof(linkNode));//申请新的节点
P->data = a;
r->next = P;//r->next指针指向新节点
r = p;//r变为新节点的P的复制
i++;
printf("请输入链表第%d个元素:", i);
}
r->next = NULL;//循环结束表示在链表尾部插入数据结束,r->next下个节点为空,r这时是尾节点的复制(r永远是尾节点复制);
}
注意
1. 创建单链表是H->next = NULL;
2. H节点不能变动,所以要创建一个复制指针r,来不断创建新节点
3. 创建最后一个节点时r->next = NULL;
//查找:按序号查找
linkP GetList(linkP H, int i)
{
int j = 0;
link P = H;//P为头结点的复制,用于遍历
if (i < 0) return NULL;
while(P->next && j < i)
{
P = P->next;
j++;
}
if (i == j) return P;//若果i == j表示以j < i循环条件不成立,此时P指向第i个节点
else//否则就是P->next == NULL,说明i > 表长
return NULL;
}
// 按值查找(若果存在值就返回该节点的指针,不存在就返回NULL)
linkP LocateList(linkP H, int data)
{
linkP P = H->next;//这里不是P = H,因为头结点没用数据,P应该指向第一个节点的。
while(P && P->data != data)
{
P = P->next;
}
return P;// 如果循环以P->data == data结束就返回指向data的指针P,否则就以链表循环结束,P == NULL,没有找到该数据
}