单链表的增删改查(c语言)

单链表的定义:

单链表(Singly Linked List)是一种常见的数据结构,它由一系列节点构成,每个节点包括一个数据元素和一个指向下一个节点的指针。单链表中只能从头节点开始顺序遍历,每个节点只有一个指向下一个节点的指针,没有指向前驱节点的指针,因此不能倒序遍历。

优点和缺点:

单链表在插入和删除操作时具有较高的效率,因为只需要修改相邻节点的指针即可完成操作。但是在查询、访问和定位操作中,由于需要遍历整个链表才能找到指定节点,效率相对较低。

单链表的优点在于可以灵活地动态分配内存空间,可以根据实际需要不断地插入和删除节点。常见的应用场景包括实现队列、堆栈、哈希表等数据结构,以及处理大量数据时的缓存数据结构。

单链表的实现:

直接看代码

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
	int value;//储存的数据
	struct node *next;//指向下一个节点
} Node;//定义单链表的节点
typedef struct list{
   Node* head;
} List;//记录头节点


int main()
{
	List list;
	list.head=NULL;//定义头节点,让其进行初始化。
}

由此我们就可以得到一个单链表的头,在此基础上我们可以进行其他操作。

1、单链表的增添和删除

首先增添我们要先学会创建一个新节点,将我们要传入的数据输入进去,再将链表链接起来。

而链接有头接和尾接。

以尾接法为例

#include <stdio.h>
#include <stdlib.h>
void add(List* plist,int number);//增添链表
int main()
{
	List list;
	list.head=NULL;
 int number;定义一个变量
 do {
 	scanf("%d",&number);输入数据
 	if(number!=-1)//输入-1后停止
{
 	add(&list,number);
 	
}
void add(List* plist,int number)
{
Node *p=(Node*)malloc(sizeof(Node));//创建一个新节点
	 p->value=number;
	 p->next=NULL;//初始化
	 Node *last=plist->head;
	 if(last)//判断是否头节点后是否有其他节点,保证安全。
	 {
	 while(last->next)//找到最后一个节点链接
	 {
	 	last=last->next;
	 }
	 last->next=p;
	 }else
	 {
	 	plist->head=p;
	 }
}

头接则是只需要在头节点后直接链接即可,但要注意接上之前已经创建的节点。

其次是删除,删除需要找到要删除的节点,可以是第几个,也可以是某组数据。

以删除某数据为例

	int n;//定义一个变量
	scanf("%d",&n);//输入要删除的数据
	Node *q;
	Node *p;
	for(q=NULL,p=list.head;p;q=p,p=p->next)//删除链表
	{
		if(p->value==n)//查找所要删除的数据,并将删除后的前后两段链接起来。
		{
		if(q)
		{
		q->next=p->next;	
		}else
		{
		list.head=p->next;
	}
		free(p);//删除
        break;
		}
	}

注:上述代码一次只能删除一个链表节点。

2、单链表的打印

打印需要遍历整个链表,将每一个所对应的数据打印出来。

void print(List* plist)
{
Node *p;	
	for(Node *p=plist->head;p;p=p->next)//遍历链表
	{
		printf("%d ",p->value);
	}
printf("\n");
	
 } 

3、单链表的查找

查找需要在整个链表中寻找,这里以直接遍历为例,来寻找是否存在某组数据。

int chazhao(List* plist,int n)//返回一个int类型的值来判断是否找到。n为寻找的数据。
{
	Node *p;
	int i=1;
	for(Node *p=plist->head;p;p->next)
	{
		if(p->value==n)
		{
			return i;//找到
		}
		i++;
	}
	return 0;//没找到
}

4、链表的修改

链表的修改是在查找的基础上进行的,只需要将修改后的值传入链表对应位置即可。

void xiugai(List *plist,int n,int m)//n为链表的位置,m为修改后的值
{
	Node *p=plist->head;
	
	for(int i=0;i<n;i++)//遍历寻找要修改的节点
	{
		p=p->next;
	}
	p->value=m;//修改其数据
}

以上是我对在单链表的学习上的一些认识,其中有不足的地方,代码都是初学的时候自己写的,没有进行优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } void insertFront(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } void insertAfter(struct Node* prev_node, int new_data) { if (prev_node == NULL) { printf("Previous node cannot be NULL\n"); return; } struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = prev_node->next; prev_node->next = new_node; } void insertEnd(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); struct Node* last = (*head_ref); new_node->data = new_data; new_node->next = NULL; if (*head_ref == NULL) { *head_ref = new_node; return; } while (last->next != NULL) last = last->next; last->next = new_node; return; } void deleteNode(struct Node** head_ref, int key) { struct Node* temp = *head_ref, *prev; if (temp != NULL && temp->data == key) { *head_ref = temp->next; free(temp); return; } while (temp != NULL && temp->data != key) { prev = temp; temp = temp->next; } if (temp == NULL) return; prev->next = temp->next; free(temp); } void modifyNode(struct Node* node, int old_data, int new_data) { while (node != NULL) { if (node->data == old_data) { node->data = new_data; return; } node = node->next; } printf("%d not found in the list\n", old_data); } int main() { struct Node* head = NULL; insertEnd(&head, 1); insertFront(&head, 2); insertFront(&head, 3); insertEnd(&head, 4); insertAfter(head->next, 5); printf("Original List: "); printList(head); deleteNode(&head, 3); printf("List after deleting 3: "); printList(head); modifyNode(head, 2, 6); printf("List after modifying 2 to 6: "); printList(head); return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值