链表的插入删除主要是要考虑如果为空表,删除第一个等特殊情况,考虑全面。
具体实现如下
c
#include<stdlib.h>
#include<stdio.h>
struct Node {
int data;
struct Node* next;
};
struct Node* head;
void print()
{
struct Node* temp = head;
printf("list is:");
while (temp != NULL)//遍历操作
{
printf(" %d", temp->data);
temp = temp->next;
}
printf("\n");
}
void Insert(int data, int n)
{
//先创建该结点
struct Node* temp1 = (struct Node*)malloc(sizeof(struct Node));
temp1->data = data;
temp1->next = NULL;
if (n == 1)//如果插在第一个位置
{
temp1->next = head;//空表也可以
head = temp1;
return;
}
//找到要插入位置的前一个
struct Node* temp2 = head;
for (int i = 0; i < n - 2; i++)//移动n-2次
{
temp2 = temp2->next;
}
//把temp2的位置移到第n-1个位置
temp1->next = temp2->next;
temp2->next = temp1;
return;
}
//delete node
//注意如果想删除的结点位于头结点
//删除后要释放空间
void Delete(int n)//删除第n个位置
{
struct Node* temp1 = head;
// if the previous node does not exist
if (n == 1)
{
head = head->next;
free(temp1);
return;
}
// if the previous node exists
for (int i = 0; i < n - 2; i++)//移动n-2次
{
temp1 = temp1->next;//temp1 points to(n-1)th Node
}
struct Node* temp2 = temp1->next;//准备删除的结点
temp1->next = temp2->next;
free(temp2);
}
int main()
{
head = NULL;//初始化空表
Insert(2, 1);
Insert(3, 1);
Insert(4, 3);
print();//list is: 3 2 4
Delete(1);
print();//list is: 2 4
Delete(2);
print();//list is: 2
return 0;
}