引言: 最近在网上刷算法题刷到链表的操作,这里和大家一起分享一下。
//1、创建链表(创建一个表头表示整个链表)
//2、创建节点
//3、插入节点
//4、删除节点
//5、遍历整个链表
一、链表的创建:
1、这里我们先定义一个结构体,结构体内有两个成员,地址和数据。
struct Node{
int data; //数据域
struct Node* next; //地址域
};
2、这里我们使用动态创建链表的方式去建立链表的表头和结点。使用malloc函数去向系统申请一块“struct Node”大小的地址,随后将他初始化。
struct Node* CreatList() //创建链表表头
{
struct Node* HeadNode = (struct Node*)malloc(sizeof(struct Node));
//HeadNode ->data = 1;
HeadNode ->next = NULL;
return HeadNode ;
}
3、这里我们再去用同样的方式去新建几个结点。
struct Node* NewNode(int data) //创建新的结点
{
struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
NewNode ->data = data;
NewNode ->next = NULL;
return NewNode;
}
4、在Main函数中创建表头和结点,初始化并打印出来
int main(void)
{
struct Node* list = CreatList();
struct Node* Node1 = NewNode(1);
struct Node* Node2 = NewNode(3);
struct Node* Node3 = NewNode(4);
list ->next = Node1;
Node1->next = Node2;
Node2->next = Node3;
printf("-----------------\n");
PrinfList(list);
return 0;
}
二、打印链表:打印链表,这里用的是去遍历链表中的每个结点,直到遍历至链表的末尾Node->next ==NULL结束,并把结点中的数据域的值打印出来。
void PrinfList(struct Node* HeadNode) //打印链表
{
struct Node *pMove = HeadNode ->next;
while(pMove)
{
printf("%d\n",pMove->data);
pMove = pMove ->next;
}
}
三:链表任意位置插入结点:
void insertNode(struct Node* HeadNode,int data) //链表插入结点
{
struct Node *insertNode = NewNode(data);
struct Node *pMove = HeadNode->next;
//判断链表是否为空,若为空直接将结点插到表头的后一个结点
if(pMove == NULL)
{
HeadNode ->next = insertNode;
}
//对于有序链表我们可以直接遍历链表数据域和插入结点的值,将移动结点停在要插入的位置的
前一个结点位置,然后将其插入。
else
{
while(data > pMove->data)
{
HeadNode= HeadNode ->next;
if(pMove ->next ==NULL)
{
break;
}
else
pMove = pMove ->next;
}
insertNode ->next = HeadNode ->next;
HeadNode ->next = insertNode;
}
}
四、删除结点:
void deleteNode(struct Node* HeadNode,int data) //链表删除结点
{
struct Node* pMove = HeadNode->next;
//如果链表本身为空,那么无结点可以删除。
if(pMove ==NULL)
{
HeadNode->next =NULL;
}
//通过遍历链表的方式找到链表中的第一个结点的值和要被删除的结点值比较。
else
{
while(data != pMove->data)
{
pMove = pMove->next;
HeadNode = HeadNode->next;
}
HeadNode->next = pMove->next;
}
}