链表(插入与删除)2023/8/8

( 节点的插入与删除都分为两种情况:①节点位于头部 
                                                              ②节点位于其他位置 )

一. 头部插入一个节点:

 (逻辑视图如下:)

   

 首先head作为头节点,先清空节点,在头部插入节点时,首先创建一个新的指针变量temp,对其进行解引用,temp->next则指向head,而head指向temp所在的位置100.

(代码如下:)

#include <stdio.h>
#include <stdlib.h>
struct Node{
    int data;
    struct Node* next;
};
struct Node *head ;//定义全局变量,结构体指针;
void Insert(int x){
    struct Node *temp = (struct Node*) malloc(sizeof(struct Node));
    temp ->data=x;
    temp->next=head;
    head=temp;
}//插入函数
void print(){
    struct Node *temp = head;
    while(temp!=NULL){
        printf("%d ",temp->data);
        temp=temp->next;
    }
    printf("\n");
}//打印函数
int main() {
head = NULL;//清空链表
int n,i,x;
scanf("%d",&n);
for(i=0;i<n;i++){
    scanf("%d",&x);
    Insert(x);
    print();
}
}
输入3 45

->45

输入58
->58 45

输入27
->27 58 45
#在 print 函数中,为何使用临时变量temp?

     答:因为我们不能修改链表头,否则我们将会失去对第一个节点的引用。因此我们用一个临时变量保存头节点,再用temp = temp -> next来遍历链表。

二. 任意位置插入一个节点

(逻辑视图如下:在第三个节点处插入一个节点)

 (代码实现:)​​​​​​​

#include<stdio.h>
#include<stdlib.h>
struct Node{
    int data;
    struct Node *next;
};
struct Node* head;
void insert(int data,int n){
    struct Node *temp1=(struct Node*)malloc(sizeof(struct Node*));//temp1是要插入的节点
    temp1->data=data;
    temp1->next=NULL;
    if(n==1){
        temp1->next=head;
        head=temp1;
        return;
    }//该特殊情况是指链表为空的情况

    //接下来对于其他插入到第n个节点的情况,我们首先要找到第n-1个节点
    struct Node *temp2=(struct Node*)malloc(sizeof(struct Node*));
    temp2 = head;
    for(int i=0;i<n-2;i++){
        temp2 = temp2->next;
    }//此时temp2是一个临时变量,指该链表的第n-1个节点
    temp1->next=temp2->next;
    temp2->next=temp1;
}
void print(){
    struct Node*temp=head;
    while(temp!=NULL){
        printf("%d ",temp->data);
        temp= temp->next;
    }
    printf("\n");
}//遍历链表
int main(){
    head = NULL;//empty list
    insert(2,1);//list:2
    insert(3,2);//list:2,3
    insert(4,1);//list4,2,3
    insert(5,2);//list4,5,2,3
    print();
}
运行结果:
 

4 5 2 3

三.任意位置删除一个节点

 首先创建全局结构体变量

#include <stdlib.h>
#include <stdio.h>
struct Node{
    int data;
    struct Node* next;
};
struct Node *head;//指向链表中第一个节点的地址

其次要创建三个函数:1 . 插入函数; 2 . 删除函数;3 . 打印函数

void insert(int data);
void print();
void delete(int n);

(删除函数需要考虑删除的是否为头节点

void delete(int n){
    struct Node* temp1=head;
    int i;
    for(i=0;i<n-2;i++)
        temp1=temp1->next;//使之指向n-1个节点
    struct Node* temp2=temp1->next;//指向要删除的节点
    temp1->next=temp2->next;//连接删除后断掉的节点
}
void delete(int n){
    struct Node* temp1=head;
    int i;
    if(i==1){
      head=temp1->next;
        free(temp1);
        return;
    }
    for(i=0;i<n-2;i++)
        temp1=temp1->next;//使之指向n-1个节点
    struct Node* temp2=temp1->next;//指向要删除的节点
    temp1->next=temp2->next;//连接删除后断掉的节点
}

 

此时断掉的节点已经修复,所以我们要用free()函数进行释放已经删除的变量

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值