void Build(DuLinkList *L,int n)//环的建立
{
int i;
DuLinkList p,q;
*L = (DuLinkList)malloc(sizeof(DuLNode));
(*L)->number = 1;
srand((int)time(NULL));
(*L)->key = rand()%10+1;
if(n<=0){
printf("\t\t不能创建joseph环,请重新输入指令\n");
}
else if(n==1){
(*L)->next = (*L)->prior= (*L);
}
else{
p = *L;
for(i = 2;i<=n;i++){
q = (DuLinkList)malloc(sizeof(DuLNode));
q->number = i;//进行编号
q->key = rand()%10+1;//产生随机正整数密码
p->next = q;
q->prior = p;
p = q;
}
printf("1\n");
q->next = *L;
(*L)->prior = q;
}
//free(q);为什么不能释放q
}
首先,确定无疑的是,你这块代码是可以执行到printf("1\n");这个地方的。
其次,执行到这个地方对内存也有一定的要求的,理论上最少占用内存是111111111*16/1024/1024/1024G的内存。
执行完之后,查看实际占用了有1.9G内存之多。
你的系统要能保证提供到1.9G内存且这个时候运行依然很顺畅。
最后那个free(q)的地方,只是free当前一个节点(最后一个节点),其它节点的free要依次通过next去free,
且置NULL,防止循环回来,多次free同一段内存。
下面附代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
typedef struct _DULNODE
{
int number;
int key;
struct _DULNODE *prior;
struct _DULNODE *next;
} DuLNode, *DuLinkList;
void Build(DuLinkList *L,int n)//环的建立
{
int i;
DuLinkList p,q;
*L = (DuLinkList)malloc(sizeof(DuLNode));
(*L)->number = 1;
srand((int)time(NULL));
(*L)->key = rand()%10+1;
if(n<=0)
{
printf("\t\t不能创建joseph环,请重新输入指令\n");
}
else if(n==1)
{
(*L)->next = (*L)->prior= (*L);
}
else
{
p = *L;
for(i = 2;i<=n;i++)
{
q = (DuLinkList)malloc(sizeof(DuLNode));
q->number = i;//进行编号
q->key = rand()%10+1;//产生随机正整数密码
p->next = q;
q->prior = p;
p = q;
}
printf("1\n");
q->next = *L;
(*L)->prior = q;
}
//free(q);为什么不能释放q
}
int main()
{
DuLinkList t;
Build(&t, 111111111);
pause();
return 0;
}