单链表的插入与删除

顺序结构的缺点还是蛮大的,现在来看看单链表的插入与删除。

单链表中,在C语言可以用结构体指针描述:

typedef struct Node
{
	ElemType data;
	struct Node * next;	//p->data,p->next->data
}Node;
typedef struct Node * LinkList


 

有一点很重要

比如我随便画一个。。

单链表的插入与删除_第1张图片

 

千万别也成

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;
}


 

 

你可能感兴趣的:(c,算法,struct,语言)