[数据结构]单链表的创建,插入及删除(更新ing)

单链表有带头指针的和不带头指针的,如图所示:

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;

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值