顺序结构的缺点还是蛮大的,现在来看看单链表的插入与删除。
单链表中,在C语言可以用结构体指针描述:
typedef struct Node
{
ElemType data;
struct Node * next; //p->data,p->next->data
}Node;
typedef struct Node * LinkList
有一点很重要
比如我随便画一个。。
千万别也成
p->next=s;s->netx=p->next;
正确的是
s->netx=p->next;p->next=s;
自己好好想想,不打了。记得是逆序就行了~
好,进入正题,单链表第i个数据插入节点的算法思路:
1.声明一节点p指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;
4.否则查找成功,在系统中生成一个空节点s;
5.将数据元素e赋给s->data;
6.单链表插入标准语句s->next=p->next;p->next=s;
7.返回成功。
实现代码算法如下:
//在L中第i个位置之前插入新的数据元素e,L的长度加1
int ListInsert(LinkList *L,int i,ElmeType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while(p && j<1)
{
p = p->next;
++j;
}
if(!p || j>=1)
return ERROR;
s = (LinkList)malloc(sizeof(Node)); //生成新节点
s->data = e;
s->next = p->next;
p->next = s; //顺序绝对不变
return OK;
}
如何删除呢?其实只要q=p->next;p->next->q->next;
算法思路省略,直接给出代码:
//删除L第i个元素,并用e返回其值,L的长度减1
int ListInsert(LinkList *L,int i,ElmeType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while(p && j<1)
{
p = p->next;
++j;
}
if(!(p->next) || j>=1)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
free(q); //释放内存
return OK;
}