c语言单向链表的一个小结

李财日记 李财日记 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
/*第一版
代码实现功能:
创建任意长度链表,然后再将链表打印出来。没有做输入参数检查*/
#include <stdio.h>
#include <stdlib.h>

/*********创建新的链表**************/
node_list creat_list(int len)
{
node_list head, p;

p = (struct my_node *)malloc(sizeof (node));
head = p;
if (p == NULL)
exit(0);

if (len ==0)
head = NULL;

int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));

p = p->next; //循环出去要释放这片内存
p->next = (struct my_node *)malloc(sizeof (node));

len = len-1;
i++;
}
free(p); //释放多申请的那片内存
p = NULL; //设置链表尾部

return head;
}

/******显示函数********/
void printf_list(node_list struct_head)
{
int i = 1;
node_list my_struct_head = struct_head; //保持输入参数不变

if (my_struct_head == NULL)
{
printf("空链表\n");
return;
}

while (my_struct_head != NULL)
{
printf("链表第%d个节点 %d %d\n", i, my_struct_head->predata, my_struct_head->nextdata);

my_struct_head = my_struct_head->next;
i++;
}


return;
}

int main(void)
{
node_list input_listA, input_listB;
node_list output_listC;


unsigned lenA, lenB;
printf("请输入链表 A 的长度:");
scanf("%d", &lenA);
printf("\n");
input_listA = creat_list(lenA);



printf("请输入链表 B 的长度:");
scanf("%d", &lenB);
printf("\n");
input_listB = creat_list(lenB);


printf_list(input_listA);
printf("\n");
printf_list(input_listB);

return 0;
}

第一版出现的问题:链表只能存储一个节点
出现原因:未给 p->next 分配内存便让 p 指向它,导致给 p->next 分配完内存 p 的指向不会是 p->next
而是未知内存。我的编译器是将没有初始化的指针指向 NULL 的,使用只会有一个节点出现。
造成的后果:1、链表不能成功的创建。2、申请的内存不会有释放,会造成内存泄漏。3、如果编译器没有将为初始化
的指针指向 NULL ,那么将会导致指针指向未知内存,给系统带来一定的风险。
/*第二版:
因为问题代码都是链表创建函数的问题,故只对这部分代码做修改*/
node_list creat_list(int len)
{
node_list head, p;

p = (struct my_node *)malloc(sizeof (node));
head = p;
if (p == NULL)
exit(0);

if (len ==0)
head = NULL;

int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));

//p = p->next; //循环出去要释放这片内存
p->next = (struct my_node *)malloc(sizeof (node));
p = p->next; //循环出去要释放这片内存 这里有改动

len = len-1;
i++;

}
free(p); //释放多申请的那片内存
p = NULL; //设置链表尾部

return head;
}

出现问题:链表创建后会始终有一片多分配出来的内存。
例如输入一个节点数据为 1 2 而输出为 1 2 和 0 0,创建多个链表时还会出现链表
重叠
出现原因:链表尾部设置有问题,p 已经指向 p->next 故p与上一个节点的next无关,
故链表尾部没有被设置,会出现以上情况是因为我的编译器会将没有初始化的指针指向
NULL ,并且将数据清零,就是说我并没有设置链表尾部,而是编译器碰巧给我设置了
链表尾部。
造成后果:1、链表不能成功按要求创建。2、编译器如果没有将为初始化指针指向 NULL
那么对未知内存操作会给系统带来风险。3、因为严格释放了内存,所以不会出现内存泄漏。
/*第三版:
因为问题代码都是链表创建函数的问题,故只对这部分代码做修改*/
node_list creat_list(int len)
{
node_list head, p, tmp;

p = (struct my_node *)malloc(sizeof (node));
head = p;
if (len ==0)
head = NULL;

int i = 1; //计数方便显示
while (len != 0) //循环创建链表
{
printf("请输入链表的第%d个节点的predata和nextdata!\n", i);
scanf("%d%d", &(p->predata), &(p->nextdata));

tmp = p; //相对第二版的改动
p->next = (struct my_node *)malloc(sizeof (node));
p = p->next;
len = len-1;
i++;
}
free(p); //释放多申请的那片内存
tmp->next = NULL; //设置链表尾部

return head;
}

成功创建一个len长度的链表,但代码太绕不便理解。还有一部分的内存管理问题,出现bug的机会会比较大




/* 第四版:基于Linux内核单向链表创建
*/
#include <stdio.h>
#include <stdlib.h>

typedef int datatype;

typedef struct node
{
datatype data;
struct node *next;
}listnode, *singly_list;


singly_list init_list(void) //初始化链表,拿到尾部节点
{
singly_list mylist = malloc(sizeof (listnode));
if (mylist != NULL)
{
mylist->next = NULL;
}
else
{
printf("分配内存失败!!!\n");
exit(1);
}

return mylist;
}

singly_list new_node(datatype data, singly_list next) //新的节点放在前面,完美,因为初始化的时候创建的是
{ //尾部节点,故链表的尾部不会出现问题。妙啊
singly_list new = malloc(sizeof (listnode));
if (new != NULL)
{
new->data = data;
new->next = next;
}
else
{
printf("分配内存失败!!!\n");
exit(1);
}

return new;
}


...全文

相关推荐

C语言之单向链表详解及实例代码

1,单向链简洁。 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点;列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向nuLL的指针; 2,例子要求: 根据示例代码中的例子,完成单向链表(single linked list)中的以字符串为数据的链表的插入、删除以及查找,并支持单向链表的反转; 3,代码实现。 #include <stdio> #include &lt;math.h&gt;

weixin_38666785

C语言实现单向链表的创建、插入,删除节点,和2个链表合并

VC6.0下 用C语言实现单向链表的创建、插入,删除节点,和2个链表合并等操作

shizhihao1984

C/C++实现单向链表

分别用C和C++实现了单向链表(创建链表,插入数据、获取指定位置的数据、删除指定位置的数据...),如果在使用中觉得api不够用可以进行扩展;其中包含测试。

laying_1230

C语言单向链表的表示与实现实例详解

1.概述: C语言中的单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。 如下图所示: 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接 一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历。 链表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存一个特殊的结束标记,另外在一个固定的位置保存指向第

weixin_38711369

C语言实现带头结点的单向链表的基本操作

使用C语言实现了单向链表的创建,输出,插入元素和删除元素以及单向链表的逆序连接和两个有序线性表的归并

斯曦巍峨
评论 2
收藏 已收藏
分享
返回顶部
李财日记
C语言 70,039 成员 243,237 内容