这里我们使用了作者前面的文章中有关于在任意位置插入的代码
采用头插法,删除也是头删除
删除过程
删除过程的代码
因为我们上面给出了删除的具体过程,这次直接给出相应过程的代码;我们删除存在的几种情况我们也在代码中给出了注释,就不再具体解释
/*
这个代码适用于拥有n-1个节点,即使没有n+1个节点,如果第n+1个节点的我在是NULL,也是适用的
这个也是头删除
[date][next](节点1)->[date][next](节点2)->[date][next](节点3)
删除步骤
(1)遍历到节点1处,使用一个临时变量temp2,先去存储节点2的地址
temp2=节点1.next
(2)我们已经获得了,节点2的地址,接下来,我们要把节点2中存储的节点3的地址给temp2
节点1.next=temp.next
*/
void Delete(int n) {
//定义一个删除函数,删除链表中相应的节点
struct Node* temp1 = head;
if (n == 1) {
head = temp1->next;
free(temp1);
return;
}
//我们需要遍历到第n-1个节点
for (int i = 0; i < n - 2; i++)
{
temp1 = temp1->next;
}
//使用一个指针去存储n-1的地址,调整连接
struct Node* temp2 = temp1->next;
temp1->next = temp2->next;
free(temp2);//首先他这个是要把temp1跳到节点2上然后确定下temp2也就是3节点最后2节点的指向改为3的指向就完了然后清空3
}
代码运行结果
全部代码
语言:C语言 平台:VS2019
在代码中我们关于堆栈的区别也给出了解释
/*
功能:在链表的任何地方删除一个节点(我们删除完之后需要把那块空间给释放掉)
动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。
堆,是由程序员手动完成申请和释放的
栈,是由编译器自动分配和释放的
这里使用的是头插法
*/
struct Node {
int date;
struct Node* next;
};
struct Node* head;
void Insert(int date, int n) {
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));
temp->date = date;
temp->next = NULL;
printf("插入的节点信息为:temp->date=%d ", temp->date);
//在头节点处插入
if (n == 1) {
temp->next = head;
head = temp;
return;
}
//在其他位置插入,在第n个节点前插入
struct Node* readlist;
readlist = head;
for (int i = 0; i < n - 2; i++)
{
readlist = readlist->next;//遍历到第n-2个节点
}
printf("在节点readlist=%d处插入\n", readlist->date);
/*
这里的插入逻辑是这样子的,你可以认为我们的节点是这样子的[date][next];[date的地址]=temp,[next的地址]=temp.next
*/
temp->next = readlist->next;
readlist->next = temp;
}
void Print() {
//定义一个打印函数,打印链表的信息
//我们需要做的只是遍历链表
struct Node* tempRead = head;//为什么我们要使用临时变量,因为我们不能使用表头,否则会失去对第一个节点的引用
printf("链表是:");
while (tempRead != NULL)
{
printf(" %d", tempRead->date);
tempRead = tempRead->next;//这种方法对节点进行遍历
}
printf("\n");
}
/*
这个代码适用于拥有n-1个节点,即使没有n+1个节点,如果第n+1个节点的我在是NULL,也是适用的
这个也是头删除
[date][next](节点1)->[date][next](节点2)->[date][next](节点3)
删除步骤
(1)遍历到节点1处,使用一个临时变量temp2,先去存储节点2的地址
temp2=节点1.next
(2)我们已经获得了,节点2的地址,接下来,我们要把节点2中存储的节点3的地址给temp2
节点1.next=temp.next
*/
void Delete(int n) {
//定义一个删除函数,删除链表中相应的节点
struct Node* temp1 = head;
if (n == 1) {
head = temp1->next;
free(temp1);
return;
}
//我们需要遍历到第n-1个节点
for (int i = 0; i < n - 2; i++)
{
temp1 = temp1->next;
}
//使用一个指针去存储n-1的地址,调整连接
struct Node* temp2 = temp1->next;
temp1->next = temp2->next;
free(temp2);//首先他这个是要把temp1跳到节点2上然后确定下temp2也就是3节点最后2节点的指向改为3的指向就完了然后清空3
}
int main(void)
{
head = NULL;//初始时,链表为空
Insert(2, 1);
Insert(2,2);
Insert(4,1);
Insert(6,4);
Insert(5,3);
Print();
int n;
printf("请输入要删除那个节点\n");
scanf_s("%d",&n);
Delete(n);
Print();
}
创作不易,希望可以得到各位的点赞