单链表的删除第i个元素

单链表的删除

删除操作图示
里插入图片描述
a2的节点q,要实现q的删除,就是让他的前继节点p绕过a2直接指向后继节点a3。
p->next=p->next->next;

单链表第i个数据删除结点的算法思路:
1.声明结点p指向链表第一个结点,初始化j=1;
2.当j<i时,就遍历链表,让P的指针向后移动,不断指向下一个结点,j累加1;
3.若到链表末尾p为空,则说明第i个元素不存在;否则查找成功,将欲删除结点p->next赋值给q
4.单链表的删除标准语句p->next=q->next,将q结点中的数据赋值给e,作为返回;释放q结点。

typedef int Status;
//可以用C语言结构指针来描述单链表:
typedef struct Node
{
	ElemType data;   //数据城
	struct Node*Next;//指针域
}Node  :
typedef struct Node* LinkList;
LinkList p;
Status DeletElemLinklist(LinkList l,int i, int  e)
{
	int j;
	LinkList s;
	p=p->Next;        	//p指向表头
	for (j = 1; j < i; ++j)
	{
		p=p->Next;        //p指向第i个节点
		if (p==Null)
		{
			return err;
		}
	}
	p->Next =p->Next->Next;
	free(p);
	e=p->Next->data;									 	
 	return success;
}

无论是单链表插入还是删除算法,它们都是由两个部分组成:第一部分就是遍历查找第i元素,第二部分就是实现插入和删除元素。从整个算法来说,我们很容易可以推出他们的肘间复杂度都是0(n)。再详细点分析:如果在我们不知道第i个元素的指针位置,单链表数据结构在插入和删除操作上与线性表的顺序存储结构是没有太大优势的。
但如果,我们希望从第i个位置开始,插入连续10个元素,对于顺序存储结构意味看,每一次插入都需要移动n-i个位置,所以每次都是0(n)。而单链表,我们只需要在第一次时,找到第i个位置的指针,此时为0(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是0(1)。显然对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显

以下是删除单链表第i个结点的C语言代码,其中假设单链表的头结点为head: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; // 头插入法建立单链表 Node* createList(int n) { Node* head = (Node*)malloc(sizeof(Node)); head->next = NULL; for (int i = 0; i < n; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); printf("请输入第%d个结点的值:", i + 1); scanf("%d", &(newNode->data)); newNode->next = head->next; head->next = newNode; } return head; } // 删除第i个结点 void deleteNode(Node* head, int i) { Node* p = head; int j = 0; while (p && j < i - 1) { p = p->next; j++; } if (!p || !p->next) return; // 第i个结点不存在 Node* delNode = p->next; p->next = delNode->next; free(delNode); } // 打印单链表 void printList(Node* head) { Node* p = head->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int n, i; printf("请输入单链表的长度:"); scanf("%d", &n); Node* head = createList(n); printf("请输入要删除的结点位置:"); scanf("%d", &i); deleteNode(head, i); printf("删除后的单链表为:"); printList(head); return 0; } ``` 代码解释: 1. `createList()`函数使用头插入法建立单链表,返回头结点指针。 2. `deleteNode()`函数接受一个头结点指针和一个整数i,表示要删除第i个结点。首先遍历单链表找到第i-1个结点,然后将其next指针指向第i+1个结点,最后释放第i个结点的内存空间。 3. `printList()`函数用于打印单链表,从头结点的next开始遍历输出每个结点的值。 4. `main()`函数中读入单链表的长度和要删除的结点位置,然后调用`createList()`函数建立单链表,调用`deleteNode()`函数删除第i个结点,最后调用`printList()`函数打印删除后的单链表
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值