(c语言)free函数释放环形链表出错,求教
程序是通过一个环形链表来加密字符串的,程序本身运行正常,但是运行到free的时候,在第二次free时出错(第一次应该是正常通过了)。
内存都是通过calloc申请的所以我觉得很奇怪。
以下为代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Link
{
char i;
Link *next;
int check;
};
Link *initRLink(int wordnum)
{
Link *Linkage;
int i;
Linkage = (Link *)calloc(wordnum, sizeof(Link));
for (i = 0; i <= (wordnum - 2); i++)
Linkage[i].next = &Linkage[i + 1];
Linkage[wordnum - 1].next = &Linkage[0];
for (i = 0; i <= (wordnum - 1); i++)
Linkage[i].check = 0;
return Linkage;
}
Link *encrypt(int code, char *list, int wordnum)
{
Link *Linkage, *head;
int i, j, k = 0;
Linkage = initRLink(wordnum);
head = Linkage;
for (i = 1; i <= wordnum; i++)
{
for (j = 1; j <= ((i == 1) ? (code - 1) : code); j++)
{
Linkage = Linkage->next;
if (Linkage->check == 1)
j--;
}
Linkage->i = list[k];
Linkage->check = 1;
k++;
}
return head;
}
void outLink(Link *Linkage, int wordnum)
{
int i;
for (i = 0; i <= (wordnum - 2); i++)
{
printf("%c", Linkage->i);
Linkage = Linkage->next;
}
printf("%c", Linkage->i);
}
void freeLink(Link *Linkage, int wordnum)
{
int i;
Link *temp;
temp = Linkage;
for (i = 1; i <= (wordnum - 1); i++)
{
temp = Linkage;
Linkage = Linkage->next;//这里运行第二次的时候出错
free(temp);
}
free(Linkage);
}
int main()
{
char inp[100];
int code, wordnum;
Link *fp;
printf("请输入原文字符串:\n");
gets(inp);
printf("请输入整数加密钥匙:\n");
scanf("%d", &code);
//这个code不能越界
printf("密文字符串为:\n");
wordnum = strlen(inp);
fp = encrypt(code, inp, wordnum);
outLink(fp, wordnum);
freeLink(fp, wordnum);
return 0;
}
内存都是通过calloc申请的所以我觉得很奇怪。
以下为代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Link
{
char i;
Link *next;
int check;
};
Link *initRLink(int wordnum)
{
Link *Linkage;
int i;
Linkage = (Link *)calloc(wordnum, sizeof(Link));
for (i = 0; i <= (wordnum - 2); i++)
Linkage[i].next = &Linkage[i + 1];
Linkage[wordnum - 1].next = &Linkage[0];
for (i = 0; i <= (wordnum - 1); i++)
Linkage[i].check = 0;
return Linkage;
}
Link *encrypt(int code, char *list, int wordnum)
{
Link *Linkage, *head;
int i, j, k = 0;
Linkage = initRLink(wordnum);
head = Linkage;
for (i = 1; i <= wordnum; i++)
{
for (j = 1; j <= ((i == 1) ? (code - 1) : code); j++)
{
Linkage = Linkage->next;
if (Linkage->check == 1)
j--;
}
Linkage->i = list[k];
Linkage->check = 1;
k++;
}
return head;
}
void outLink(Link *Linkage, int wordnum)
{
int i;
for (i = 0; i <= (wordnum - 2); i++)
{
printf("%c", Linkage->i);
Linkage = Linkage->next;
}
printf("%c", Linkage->i);
}
void freeLink(Link *Linkage, int wordnum)
{
int i;
Link *temp;
temp = Linkage;
for (i = 1; i <= (wordnum - 1); i++)
{
temp = Linkage;
Linkage = Linkage->next;//这里运行第二次的时候出错
free(temp);
}
free(Linkage);
}
int main()
{
char inp[100];
int code, wordnum;
Link *fp;
printf("请输入原文字符串:\n");
gets(inp);
printf("请输入整数加密钥匙:\n");
scanf("%d", &code);
//这个code不能越界
printf("密文字符串为:\n");
wordnum = strlen(inp);
fp = encrypt(code, inp, wordnum);
outLink(fp, wordnum);
freeLink(fp, wordnum);
return 0;
}
...全文
相关推荐
C语言实现静态链表的方法
分享一段代码,一个静态链表的C语言实现,其中包含着一种简单的内存管理策略:固定大小的链式管理。
C语言循环链表实战:约瑟夫问题中的指针操作与内存安全
循环链表是理解动态内存管理与指针操作的基础数据结构,其核心在于next指针的闭环控制、节点动态增删的原子性保障,以及malloc/free配对引发的内存泄漏风险。在嵌入式开发和算法工程中,它常用于模拟环形调度、淘汰机制与无索引动态序列管理。本文以约瑟夫问题为切入点,深入剖析带头结点的循环链表构建、安全删除、报数逻辑同步等关键环节,并结合C语言裸指针操作、缓冲区溢出防护和单片机静态内存适配等真实场景,系统讲解结构体嵌套、野指针规避与环形遍历终止条件设计,助力开发者跨越从理论链表到工业级内存安全实践的关键一跃。
约瑟夫问题C语言 .
约瑟夫问题C语言
数据结构——C语言描述——耿国华版
我自己之前找了好久都没有找到合适的,现在传上来的这个事老师给的,希望对各位有帮助
约瑟夫环问题的编程实现
通过数据结构的学习利用C语言来解决约瑟夫环的问题


新手乐园
