//删除链表中任意位置的节点
#include<stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
struct Node* head;
void Insert(int x){
Node* temp=(Node*)malloc(sizeof(struct Node));//创建节点
/*malloc返回指向起始地址的指针
因为malloc返回一个void指针,所以使用(Node*)强制转换 */
//temp是指针变量 我们解引用指针变量以修改此特定节点上的值
temp->data =x;
temp->next =head;//涵盖了 链表为空和非空 这两种情况
head = temp;
}
void Print(){
struct Node* temp=head;
/*创建一个局部变量 名为temp的指向Node的指针
为什么要用局部变量 因为我们不能修改链表表头
否则我们会失去对第一个节点的引用 */
printf("list is:");
//遍历链表的循环
while(temp !=NULL){//temp非空时
printf(" %d",temp->data ); //每次打印该节点的值
temp=temp->next ;//修改局部变量的地址 转到下一个节点
}
printf("\n");
}
void Delete(int n){
struct Node* temp1=head;
if(n==1){
head=temp1->next;
//head指向第二个节点 temp1仍指向第一个节点
free(temp1); //链接已经修复 释放第一个节点
return;
}
/*以下情况适用于拥有第n-1个节点的时候,
即使没有第n+1个节点,如果第n+1个位置是NULL也适用*/
//创建一个指向节点的临时变量 将其指向head
for(int i=0;i<n-2;i++)//到达第n-1个节点
temp1=temp1->next;//temp1指向第n-1个节点
//创建一个变量以指向第n个节点 将其命名为temp2
struct Node* temp2=temp1->next;//第n个节点
//调整链接部分 第n-1个节点的地址指向第n+1个节点
temp1->next=temp2->next;//第n+1个节点
//此时temp2存储第n个节点,引用第n个节点
free(temp2);//free函数用来释放通过malloc分配的任何内存
/*如果我们用C++编程时使用new运算符来分配内存
就写:delete temp2 */
}
int main(){
head = NULL;
Insert(2);
Insert(4);
Insert(6);
Insert(5);//lise:2 4 6 5
Print();
int n;
printf("enter a position\n");
scanf("%d",&n);
Delete(n);
Print();
}