【C语言】单链表的增查

单链表的基本操作

初始化

void SListInit(SListNode **ppFirst)
{
 assert(ppFirst != NULL);
 *ppFirst = NULL;
}

从头部插入

首先需要开辟空间,因为在以后的操作中还需要动态开辟空间故把开辟空间独立封装为一个函数。

开辟空间函数
static SListNode* CreatNode(DataType data)
{
 SListNode *newnode = (SListNode*)malloc(sizeof(SListNode));
 newnode->data = data;
 newnode->next = NULL;
 return newnode;
}
头插函数

动态开辟一个新的空间,使newnode->next 指向原来的头节点,ppFirst指向newnode

void SListPushFront(SListNode** ppFirst, DataType data)
{
 assert(ppFirst);
 SListNode *newnode = CreatNode(data);
 newnode->next = *ppFirst;
 *ppFirst = newnode;
}

从尾部插入

分两种情况
1)链表为空链表:直接添加一个新节点在后面即可。
2)链表中有节点:循环找到尾节点,然后在尾节点后面插入一个新节点即可。

void SListPushBack(SListNode **ppFirst, DataType data)
{
 SListNode *newnode = CreatNode(data);
 assert(ppFirst);
 if (*ppFirst == NULL)
 {
  *ppFirst = newnode;
 }
 SListNode *cur = *ppFirst;
 for (cur; cur->next != NULL; cur = cur->next)
 {
  ;
 }
 cur->next = newnode;
}

从尾部删除

首先创建两个指针,一个指向当前位置,一个指向当前位置的下一个位置,循环下一个位置的下一个位置 判断他是否为尾节点。然后将尾节点删除,尾节点的前一个节点的地址域(Next->next)置于空。

void SListPopBack(SListNode **ppFirst)
{
 SListNode *cur = *ppFirst;
 SListNode *Next = cur->next;
 while (Next->next != NULL)
 {
  Next = Next->next;
  cur = cur->next;
 }
 free(Next);
  cur->next = NULL;
}

从头部删除

将头节点暂存(防止找不到源头节点),然后让链表的起始位置指向第二个节点,最后删除掉头节点。

void SListPopFront(SListNode **ppFirst)
{
 SListNode *cur = *ppFirst;
 ppFirst = cur->next;
 free(cur);
}

从中间插入

首先开辟一个新空间,然后使插入位置的前一个节点的next指向新节点,然后新节点的next指向插入位置的节点即可。

void SListInsert(SListNode **ppFirst, SListNode *pos, DataType data)
{
 SListNode *cur = *ppFirst;
 SListNode *newnode = CreatNode(data);
 for (cur; cur->next != pos; cur = cur->next){ ; }
 cur->next = newnode;
 newnode->next = pos;
}

删除任意位置的节点

循环找到要删除的节点,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点

void SListErase(SListNode **ppFirst, SListNode *pos)
{
 SListNode *cur = *ppFirst;
 for (cur; cur->next != pos; cur = cur->next){ ; }
 cur->next = pos->next;
 free(pos);
}

按值删除,只删遇到的第一个

循环找到要删除的数据的位置,然后删除它,将删除位置的前一个节点next指向要删除的后一个节点

void SListRemove(SListNode **ppFirst, DataType data)
{
 SListNode *cur = *ppFirst;
 SListNode *Next = cur->next;
 SListNode *del = NULL;
 while (Next->data != data)
	 {
  		Next = Next->next;
 		 cur = cur->next;
 	}
 del = Next->next; 
 Next->next = del->next;
 free(del);
 return;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是 C 语言单链表的增删改查代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct Node { int data; struct Node* next; }; // 定义链表头节点指针 struct Node* head = NULL; // 插入节点函数 void insertNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; if (head == NULL) { head = newNode; } else { struct Node* temp = head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } printf("插入节点成功!\n"); } // 删除节点函数 void deleteNode(int data) { if (head == NULL) { printf("链表为空,无法删除!\n"); return; } struct Node* temp = head; if (temp->data == data) { head = head->next; free(temp); printf("删除节点成功!\n"); return; } while (temp->next != NULL && temp->next->data != data) { temp = temp->next; } if (temp->next == NULL) { printf("未找到要删除的节点!\n"); return; } struct Node* deleteNode = temp->next; temp->next = deleteNode->next; free(deleteNode); printf("删除节点成功!\n"); } // 修改节点函数 void modifyNode(int data, int newData) { if (head == NULL) { printf("链表为空,无法修改!\n"); return; } struct Node* temp = head; while (temp != NULL && temp->data != data) { temp = temp->next; } if (temp == NULL) { printf("未找到要修改的节点!\n"); return; } temp->data = newData; printf("修改节点成功!\n"); } // 查找节点函数 void searchNode(int data) { if (head == NULL) { printf("链表为空,无法查找!\n"); return; } struct Node* temp = head; while (temp != NULL && temp->data != data) { temp = temp->next; } if (temp == NULL) { printf("未找到要查找的节点!\n"); return; } printf("找到要查找的节点,数据为:%d\n", temp->data); } // 打印链表函数 void printList() { if (head == NULL) { printf("链表为空,无法打印!\n"); return; } struct Node* temp = head; printf("链表中的节点数据为:"); while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } int main() { insertNode(1); insertNode(2); insertNode(3); printList(); modifyNode(2, 4); printList(); searchNode(3); deleteNode(2); printList(); return 0; } ``` 以上是单链表的基本操作函数,包括插入节点、删除节点、修改节点、查找节点以及打印链表等功能。你可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值