一、线性链表的元素删除
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
1、删除思想
如图:若线性链表初始化为:1,2,3,4,5
删除第3个位置的元素步骤:
(1)查找到第i的位置的前驱,使用p指向i-1处;
(2)建立q节点,使其在p的next,将q的next 给 p的next,使2的位置与4的位置相连
(3)这时将q的位置的值赋给e返回,然后free(q)或delete q;这个节点,完成删除
相关代码:
#include "stdio.h"
#include "stdlib.h"
//#include "LinkList.h"
#define ERROR 0
#define OK 1
#define TRUE 1
#define FLASE 0
#define OVERFLOW -2
#define MAX_LIST_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域(信息域)
struct LNode *next; //指针域
}LNode, *LinkList;
Status CreateList_L(LinkList &L,int n);
//构造有n个元素的有头结点的链表L
Status CreateList_L(LinkList &L,int n) {
LinkList p,q;
int i;
L = (LinkList) malloc (sizeof(LNode));
if(L==NULL) exit(OVERFLOW);
L->next = NULL;
q=L; //起初为L(头)---->NULL
for(i=1; i<=n; i++){
p = (LinkList) malloc (sizeof(LNode)); //定义p节点存储值
//scanf("%d",p->data);
p->data = i; //将i值赋给p
q->next = p; //q的next指向p
p->next = NULL; //p的next指向NULL
q = q->next; //q后移
}
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e);
//在链表中删除第i个位置的值,并用e返回其值
Status ListDelete_L(LinkList &L,int i,ElemType &e) {
LinkList p;
p=L;
int j=0; //建立一个j变量,后面需要使用判断合法性
while(p->next && j<i-1) { //寻找第i的位置,并指向i的前驱
p = p->next;
++j;
}
if(!(p->next) || j>i-1) return ERROR; //删除位置不合理
LNode *q = (LinkList) malloc (sizeof(LNode));
q = p->next; p->next = q->next;
e = q->data;
free(q); //删除并释放节点
return OK;
}
Status ListDisPlay_L(LNode *L);
//打印链表
Status ListDisPlay_L(LNode *L) {
LNode *p;
p = L->next; //p指向头结点
if(p == NULL) exit(OVERFLOW);
else {
while(p != NULL) {
if(p->next != NULL)
printf("%d,",p->data);
else{
printf("%d",p->data);
}
p = p->next; //p指针后移
}
}
}
int main(void){
LinkList L;
CreateList_L(L,5); //这里为了测试,采用1,2,3,4,5的链表,可根据自身而定
int i,e;
scanf("%d",&i);
if(ListDelete_L(L,i,e))
ListDisPlay_L(L);
else
printf("删除位置非法\n");
return 0;
}
/*
使用单链表存储结构,实现顺序表的删除操作,给出删除位置,
输出删除后线性表的元素。如果删除位置不合法则输出:
删除位置非法。
初始化线性表为:1,2,3,4,5
如:
输入:4 输出:1,2,3,5
输入:-4 输出:删除位置非法
*/
实现:
初始链表: 1,2,3,4,5
删除:3
删除:-1