#include <stdio.h>
#include <stdlib.h>
// 单链表的删除
// 定义结构体
typedef int ElemType;
typedef struct LNode{
ElemType data; // 数据域
struct LNode *next; // 指针域
}LNode, *LinkList;
// 按位置查找
LinkList GetElem(LinkList L, int SearchPos){
int i = 0;
if(SearchPos<0){
return NULL;
}
while (L && i<SearchPos){
L = L->next;
i++;
}
return L;
}
// 删除第i个位置的结点
bool ListDelete(LinkList L, int i){ // 删除结点时,头结点不会改变,所以不加&
LinkList p = GetElem(L, i-1); // 拿到要删除结点的前一个结点
if(NULL == p){
return false;
}
LinkList q = p->next; // 拿到要删除的结点
if(NULL == q){
return false;
}
p->next = q->next; // 断链
free(q); // 释放被删除结点的空间
q = NULL; // 避免野指针
return true;
}
// 尾插法
void list_tail_insert(LinkList &L){
L = (LinkList)malloc(sizeof(LNode)); // 申请头结点的空间
L->next = NULL;
ElemType x;
scanf("%d", &x);
LNode *s, *r=L;
while (x != 9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s; // 原有链表的尾结点指向新结点
r = s; // 新结点变为尾结点
scanf("%d", &x);
}
r->next = NULL;
}
// 打印链表
void PrintList(LinkList L){
L = L->next; // 去到第一个结点
while(L != NULL){
printf("%d", L->data);
L = L->next;
if(L != NULL){
printf(" ");
}
}
printf("\n");
}
// 主函数
int main() {
LinkList L; // 链表的头指针,也代表链表
list_tail_insert(L);
PrintList(L);
ListDelete(L, 4); // 删除第4个结点
PrintList(L);
return 0;
}
删除第4个结点