详解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;

}

总结

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

以上是 详解C语言之单链表 的全部内容, 来源链接: utcz.com/p/247662.html

回到顶部