单链表有带头指针的和不带头指针的,如图所示:
Ref:https://www.cnblogs.com/youxin/p/3279391.html
本文实现带头指针的单链表创建,插入及删除
1.单链表创建
ptr为头指针,指向头结点地址,即该指针变量的值为头结点地址;
mov为一个辅助指针,用于将链表尾节点的指针域next指向新增节点的地址.
search为一个辅助指针,用于遍历链表各节点地址,打印各节点数据;
根据上面思路,使用C语言实现了单链表的创建,插入和删除,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
typedef struct Node{
int data;
struct Node* next;
}Node;
void create_link(Node*,int );
void print_link(Node*);
void delete_link_No(Node* ,int );
void delete_link_value(Node*,int);
int main()
{ /*创建头指针和头结点,进行初始化*/
Node* ptr = NULL;//定义头指针;
Node* Head = (Node*)malloc(sizeof(Node));//定义头结点
Head->data = 0, Head->next = NULL;//头结点初始化,此处数据不使用,也可以保存链表的长度;
ptr=Head;
/*创建LENGTH长度的链表*/
create_link(ptr, LENGTH);
print_link(ptr);
printf("\n");
/*删除某一位链表*/
delete_link_No(ptr,7);
print_link(ptr);
printf("\n");
/*删除某个数值所在的链表*/
delete_link_value(ptr,90);
print_link(ptr);
return 0;
}
/*创建Length长度的链表*/
void create_link(Node* Head, int length)
{
for(int i=0;i<LENGTH;i++)//生成链表节点的数量LENGTH个(不含头结点)
{
/*定义和初始化新节点*/
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i * 10+10;
newNode->next = NULL;
/*找到链表最后一个节点,与新节点连接*/
Node* search = Head;//定义辅助指针指向头结点
while(search->next!=NULL)
{
search = search->next;
}
search->next = newNode;//链表最后一个节点指针域指向新节点地址,即链表连接新节点
}
}
void print_link(Node* Head)
{
Node* search=Head->next;//辅助指针search指向首元结点
int d=1;
while(search!=NULL)
{
printf("Node%d= %d\n",d, search->data);
search = search->next;
d++;
}
}
/*删除某一个指定节点*/
void delete_link_No(Node* Head,int rank)
{
/*定义辅助指针指向待删除节点前一节点*/
Node* p_pre=Head;//
for(int i=0;i<rank-1;i++){
p_pre=p_pre->next;
}
/*定义辅助指针指向待删除节点*/
Node* p_current=p_pre->next;
p_pre->next=(p_current)->next; //待删除节点上一个节点指向待删除节点下一个节点
free(p_current);//释放待删除节点堆空间
p_current=NULL;
}
/*删除某一个数值所在的节点*/
void delete_link_value(Node* Head,int value)
{
Node* p_pre=Head;
Node* p_current=NULL;
while((p_pre->next)!=NULL)
{
p_current=p_pre->next;
if((p_current->data)==value){
p_pre->next=p_current->next;
free(p_current);
}
else{
p_pre=p_pre->next;
}
}
}
1.设计了头结点,所以上述代码create_link可以用于链表任何位置的插入;
2.free(p_current)语句用于释放指针变量p_current所指向的堆空间,p_current指针存在于栈空间,free()函数执行之后,p_current依然保存着已释放堆空间地址,应及时指向NULL;