详解C语言之单链表

 更新时间:2021年11月17日 15:36:54   作者:ぃ咔哇依°ヽ  
这篇文章主要为大家介绍了C语言的单链表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

一、思路步骤

1. 定义结构体

a.数据域:用来存放数据

b.指针域:用来存放下一个数据的位置

2.初始化

申请头结点,并将其初始化为空

3.求当前数据元素的个数

在这里插入图片描述

a.设置一个指针变量p指向头结点和计数变量size等于0

b.循环判断p->next是否为空,如果不为空,就让指针p指向它的直接后继结点,并让size自增

c.返回size

4.插入

插入

a.设置两个指针,一个指向头结点,另一个要动态申请内存空间存放要插入的数
b.找到要插入位置的前一位,并判断插入位置是否正确
c.生成新结点,给新结点数据域赋值,执行步骤①,在执行步骤②

5.删除

删除

a.设置两个指针p、q,p指向头结点,q指向要被删除的结点

b.找到要删除位置的前一位,并判断删除位置是否正确、存在

c.q指向被删除的结点,将被删除结点的数据域赋值给x,p指向被删除结点的下一个结点,释放q的内存空间

6.释放内存空间

最后记得将头结点置空哦!要不然容易出现野指针。

二、代码

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;//给int起个别名,方便以后修改
typedef struct Node
{
	DataType data;//数据域
	struct Node *next;//指针域
}SLNode;
//初始化
void ListInit(SLNode **head)
{
	*head = (SLNode *)malloc(sizeof(SLNode));//申请头结点
	(*head)->next = NULL;
}
//求当前数据元素个数
int ListLength(SLNode *head)
{
	SLNode *p = head;
	int size = 0;
	while (p->next != NULL)
	{
		p = p->next;
		size++;
	}
	return size;
}
//插入
int ListInsert(SLNode *head, int i, DataType x)
{
	SLNode *p, *q;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("插入参数位置错误!!!\n");
		return 0;
	}
	q = (SLNode *)malloc(sizeof(SLNode));//生成新结点
	q->data = x;
	q->next = p->next;
	p->next = q;
	return 1;
}
//删除
int ListDelete(SLNode *head, int i, DataType *x)
{
	SLNode *p, *q;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && p->next->next != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (j != i - 1)
	{
		printf("删除位置参数错误!!!\n");
		return 0;
	}
	q = p->next;
	*x = q->data;
	p->next = p->next->next;
	free(q);//释放被删除结点的内存空间
	return 1;
}
//按位取
int ListGet(SLNode *head, int i, DataType *x)
{
	SLNode *p;
	int j;
	p = head;
	j = -1;
	while (p->next != NULL && j < i)
	{
		p = p->next;
		j++;
	}
	if (j != i)
	{
		printf("取出位置参数错误!!!\n");
		return 0;
	}
	*x = p->data;
	return 1;
}
//释放
void ListDestroy(SLNode **head)
{
	SLNode *p, *q;
	p = *head;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*head = NULL;
}

int main()
{
	SLNode *head;
	int i, x;
	ListInit(&head);
	for (i = 0; i < 10; i++)
		ListInsert(head, i, i + 10);
	ListDelete(head, 9, &x);
	for (i = 0; i < ListLength(head); i++)
	{
		ListGet(head, i, &x);
		printf("%d ", x);
	}
	ListDestroy(&head);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 对一个数组进行zig-zag重新排列

    对一个数组进行zig-zag重新排列

    本文介绍了“对一个数组进行zig-zag重新排列”,需要的朋友可以参考一下
    2013-03-03
  • C语言程序打豆豆(函数版)

    C语言程序打豆豆(函数版)

    今天小编就为大家分享一篇关于C语言程序打豆豆(函数版),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C语言中#pragma预处理指令的使用

    C语言中#pragma预处理指令的使用

    在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作,本文主要介绍了C语言中#pragma预处理指令的使用,感兴趣的可以了解一下
    2023-12-12
  • 详解C语言的结构体中成员变量偏移问题

    详解C语言的结构体中成员变量偏移问题

    这篇文章主要介绍了C语言的结构体中成员变量偏移问题,以讲解如何编写宏来对成员变量进行修改为主,需要的朋友可以参考下
    2016-04-04
  • C++可以函数重载而C不可以的原因分析

    C++可以函数重载而C不可以的原因分析

    函数重载是指在同一个作用域内,可以定义多个函数,它们具有相同的名称但是参数列表不同,为什么C++可以函数重载而C不可以,接下来就有小编来给大家介绍一下C++可以函数重载而C不可以的原因,需要的朋友可以参考下
    2023-12-12
  • 算法之排列算法与组合算法详解

    算法之排列算法与组合算法详解

    这篇文章主要介绍了算法之排列算法与组合算法详解,本文以字典序法、递归法为例讲解了排列算法、全组合算法等,需要的朋友可以参考下
    2014-08-08
  • C++实现strcmp字符串比较的深入探讨

    C++实现strcmp字符串比较的深入探讨

    本篇文章是对使用C++实现strcmp字符串比较进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 利用C++实现双链表基本接口示例代码

    利用C++实现双链表基本接口示例代码

    双链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,下面这篇文章主要给大家介绍了关于利用C++实现双链表基本接口的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 详解C++字符串常用操作函数(查找、插入、截取、删除等)

    详解C++字符串常用操作函数(查找、插入、截取、删除等)

    这篇文章主要介绍了C++字符串常用操作函数(查找、插入、截取、删除等),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 关于STL中list容器的一些总结

    关于STL中list容器的一些总结

    list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载
    2013-09-09

最新评论