C语言之单链表 详解C语言之单链表

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C语言之单链表 详解C语言之单链表

ぃ咔哇依°ヽ   2021-11-17 我要评论
想了解详解C语言之单链表的相关内容吗,ぃ咔哇依°ヽ在本文为您仔细讲解C语言之单链表的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:C语言详解,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;
}

总结

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们