单链表及C语言实现

本博文介绍单链表,及其C语言的实现

单链表

单链表是一种链式存取的数据结构,由每个结点单元连接而成。

每个结点单元由两部分组成:数据域和指针域,其中数据域用来存储数据,指针域用来存储下一节点的地址。

因此,每个结点的结构体可以表示为:

struct node   
{  
    数据域;
    struct node *next;//指针域
}

单链表的示意图如下:
在这里插入图片描述

单链表操作

插入

头结点插入

  • 头结点为空
  1. 只需将现有结点作为头结点
  2. 头结点的next指针指向NULL
head=ptr;
ptr->next=NULL;
  • 头结点不为空
  1. 使新结点的链接部分指向现有的头结点
  2. 将新结点作为头结点

示意图如下:
在这里插入图片描述

操作如下:

ptr->next=head;
head=ptr;

尾结点插入

  • 尾结点为空的情况和头结点为空的情况一致
  • 尾结点不为空
  1. 应先通过temp=temp->next先移动到最尾结点
  2. 使尾结点指向新结点
  3. 新插入结点的next指向NULL

示意图如下:
在这里插入图片描述

操作如下:

temp->next=ptr;
ptr->next=NULL;

指定位置插入

  1. 应先通过temp=temp->next先移动到指定位置
  2. 使新结点ptrnext指向temp的下一部分地址
  3. tempnext指向新结点ptr即可

示意图如下:
在这里插入图片描述

操作如下:

ptr->next=temp->next;
temp->next=ptr;

删除

头结点删除

  1. 将头结点指向下一结点
  2. 释放原来的头结点

示意图如下:
在这里插入图片描述

操作如下:

ptr=head;
head=head->next;
free(ptr);

尾结点删除

  • 只有一个结点
    直接释放该结点:
ptr=head;
head=NULL;
free(ptr);
  • 有多个结点
  1. 由于是单链表,因此一个指针要想删除尾结点是不可行的,因此还应使用另外一个指针指到倒数第2个指针上(用于修改next的指向)
  2. 使用ptr=ptr->next移动到最后一个位置
  3. 使倒数第二个指针的nextNULL
  4. 释放倒数第1个指针(ptr

示意图如下:
在这里插入图片描述
操作如下:

ptr=head;
while(ptr->next!=NULL){
	p=ptr;
	ptr=ptr->next;
}
p->next=NULL;
free(ptr);

指定位置删除

  1. 由于为单链表,若指定位置为的结点为ptr,想删除ptr的话必须得对ptr上一位置进行操作,因此使用两个指针:pptr
  2. 通过ptr=ptr->next移动到指定位置
  3. 使指定位置的上一位置的指针p指向指定位置的下一位置
  4. 释放指定位置指针ptr

示意图如下:
在这里插入图片描述

操作如下:

移动指定步{
	p=ptr;
	ptr=ptr->next;
}
p->next=ptr->next;
free(ptr);

遍历

给定头结点,挨个遍历就行:

ptr = head;   
while (ptr!=NULL){  
    ptr = ptr -> next;  
}

查找

遍历的时候只需要与给定数据进行比对即可完成查找:

ptr = head;   
while (ptr!=NULL){
	if(ptr->data==data){
		找到了
	}  
    ptr = ptr -> next;  
}

单链表C语言的实现

以上所有描述的操作均使用C语言进行了实现,具体代码见Github

代码的实现效果如下:
在这里插入图片描述

才疏学浅,难免有错误和不当之处,欢迎交流批评指正!
同时有问题的话欢迎留言或邮箱联系(ljt_IT@163.com)。

创作不易,觉得写得不错就微信扫码奖励一下吧!

Reward

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,下面是单链表反转的C语言实现代码: ```c #include<stdio.h> #include<stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (curr != NULL) { struct ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp; } return prev; } int main() { struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->val = 1; head->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->val = 2; head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->next->val = 3; head->next->next->next = NULL; struct ListNode* new_head = reverseList(head); while (new_head != NULL) { printf("%d ", new_head->val); new_head = new_head->next; } return 0; } ``` 这段代码中,我们首先定义了一个 `ListNode` 结构体,表示单链表的节点。其中,`val` 表示节点的值,`next` 表示指向下一个节点的指针。接着,我们定义了 `reverseList` 函数,用于反转单链表。在函数中,我们使用了三个指针变量 `prev`、`curr` 和 `nextTemp`,分别表示当前节点的前一个节点、当前节点和当前节点的后一个节点。在循环中,我们不断地将当前节点的 `next` 指针指向前一个节点,然后更新三个指针变量的值,直到当前节点为 `NULL`。最后,我们返回反转后的单链表的头指针 `prev`。在 `main` 函数中,我们构造一个简单的单链表,并且调用 `reverseList` 函数进行反转,最后输出反转后的单链表的节点值。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值