( 节点的插入与删除都分为两种情况:①节点位于头部
②节点位于其他位置 )
一. 头部插入一个节点:
(逻辑视图如下:)
首先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()函数进行释放已经删除的变量