单链表的按照位序插入带头节点
//单链表的存储结构,先对单链表的存储结构进性封装
typedef struct {
Elemtype data//数据域
LNode *next;//指针域
}LNode , *LinkList
//在第I个位置插入元素e
//首先要判断插入的位置是否合法
bool ListInsert (LinkList &L , int i, Elemtype e){
if (i< 1)
return false;
LNode *p//指针P指向当前扫描扫描到的结点
int j = 0; 当前p指向向的是第几个结点
p = L;
//首先要找到第I-1个结点的位置
while(p!=NULL && j < i-1){ 判断p!=NULL,是为了判断防止输入的I值过大
p=p->next;
j++;
}
if(p=NULL)
return false;//i的值不合法
//若找到第i-1个位置
LNode *s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true; //插入成功;
}
按位序插入不带头节点
bool ListInsert(LinkList &L, int i ,Elemtype e){
if(i==1){//位置1处的的结点插入的操作与其他结点不同
LNode *s =new LNode;
s->data = e;
s-> next = L;
L = s; //头指针指向新的结点,不管带不带头结点,头指针都指向第一个结点
return true;
}
LNode *p//指针P指向当前扫描扫描到的结点
int j = 1; 当前p指向向的是第几个结点,这里要注意
p = L;
//首先要找到第I-1个结点的位置
while(p!=NULL && j < i-1){ 判断p!=NULL,是为了判断防止输入的I值过大
p=p->next;
j++;
}
if(p=NULL)
return false;//i的值不合法
//若找到第i-1个位置
LNode *s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true; //插入成功;
}
**
指定结点的前插操作
将结点插入到该节点之后,然后再将两结点中的数据进行交换
bool IsertPriorNode(LNode *p ,ElemType e){
if (p==NULL)
return false;
LNode *s = new LNode;
if(s==NULL)//内存分配失败
return false;
s->next = p->next;
p->next =s;
s->data = p->data;
p->data =e;
}
指定结点的后插操作
bool InsertNextNode (LNode *p , ElemType e){
if (p==NULL)
return false;
LNode *s = new LNode;
if(s== NULL)
return false;//内存分配失败
s->data = e;
s->next = p->next;
p->next =s;
return true;
}
带头结点的删除操作
bool ListDelete (LinkList &L ,int i ,ElemType &e){
if(i < 1)
return false;
LNode *p;
int j=0;
p=L;//指向头节点,头结点是第0个结点
while(p!=NULL && j < i-1){//循环找到第 i-1 个结点
p=p->next;
j++;
}
if(p==NULL)
return false;//i的值不合法
LNode *q = p->next;//q指向被删除的结点
e = q->data;
p->next = q->next;
free(q); //始放结点的储存空间
return true;
}
删除指定结点p
bool DeleteLNode (LNode *p){
if (p==NULL)
return false;
LNode *q = p->next ; //令q节点指向*p的后继节点
p->data = p->next->data;//和后继结点交换数据域
p->next = q->next;//将*q结点从链中断开
free(q);
return true;
}