结构
typedef struct LNode{
EmlemType data;
struct LNode *next;
}LNode,*LinkList;
初始化一个单链表(不带头节点)
bool InitList(LinkList &L){
L=Null; //空表,防止脏数据
return true;
}
初始化一个单链表(带头节点)
bool InitList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
if(L==null) //内存不足分配失败
return false;
L->next=null;
return true;
}
void test(){
LinkList L;//声明一个指向单链表的指针,此处并未创建一个结点
InitList(L);
}
指定位置插入节点 第i处插入e,以下皆是探讨带头节点
bool ListInsert(LinkList &L,int i,int e){
if(i<1)
return false;
LNode *p;
int j=0;//p当前指向的是第几个节点
p=L;//L指向头节点,头节点是第0个节点
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL){//i值不合法
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
在结点后面插入结点
bool InsertNextNode(LNode *p,ElemType e){
if(p==NULL){
return;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
结点前插入结点
//在指定结点前插入思想,先创建一个结点s,插入p的后面,然后将p的数据放入s,然后p在放入要插入的数据,偷梁换柱
bool InsertPriorNode(LNode *p,ElemType e){
if(p==NULL){
return false;
}
LNode *s=(LNode *)malloc(sizeof(LNode));
if(s==NULL){
return false;
}
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return true;
}
//删除指定结点p,将p的下个结点值给p,p的指针指向下下个结点,最后释放掉p->next结点 ,狸猫换太子
bool DeleteNode(LNode *p){
LNode *q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);
return true;
}