定义单链表的结构体
typedef struct Node{
ElemType data; //存放元素值
struct Node *next; //指向后继节点
}Linklist //单链表节点类型
单链表的插入操作:(例如:在单链表L中第 i 个位置插入新的数据元素e,或者说在第i个位置之前插入新的数据元素e,都是一样的意思,自己慢慢琢磨),下面让我们分步进行操作。
- 查找第 i 个结点(实际输出的p,是指向i的前一个结点,p->next才是指向i个结点)
Status ListInsert(LinkList *L ,int i,Elemtype e){
int j;
LinkList p;
p = *L;//p此处是被头指针赋值,p = head
j = 1;
while(p && j<i){
p = p->next;
j++;//这里j++与++j都一样的效果
}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
if(!p || j>i){//增强程序健壮性的判断语句
return ERROR;
}
}
- 插入元素e
LinkList s;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
合并(单链表的插入):
Status ListInsert(LinkList *L ,int i,Elemtype e){
int j;
LinkList p,s;
p = *L;//p此处是被头指针赋值,p = head
j = 1;
while(p && j<i){
p = p->next;
j++;//这里j++与++j都一样的效果
}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
if(!p || j>i){//增强程序健壮性的判断语句
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return bingo;
}
单链表的插入操作:(例如:在单链表L中删除结点L,并输出i结点的值),也是分两步进行操作。
- 查找第 i 个结点(与插入操作一样,代码就不再展示,但仍要注意实际输出的p,是指向i的前一个结点,p->next才是指向i个结点)
- 删除第i个结点
p = p->next->next;
*e = p-next-data;
free(p-next);
也可以借用一个数
Linklist q;
q = p->next;
p->next = q->next;
*e = p-next-data;
free(p-next);
合并(单链表的删除):
Status ListDelete(LinkList *L ,int i,Elemtype *e){
int j;
LinkList p,q;
p = *L;//p此处是被头指针赋值,p = head
j = 1;
while(p && j<i){
p = p->next;
j++;//这里j++与++j都一样的效果
}//这个循环输出的是p,比如在第2个位置上插入,i=2循环一次,p是指向第一个结点的,p->next才是指向第二个结点
if(!p || j>i){//增强程序健壮性的判断语句
return ERROR;
}
q = p->next;
p->next = q->next;
*e = p-next-data;
free(p-next);
return bingo;
}