首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言循环链表,求指导

2013-07-01 
C语言循环链表,求指点!昨天一个同学发来以下这段代码让我帮她改一下错,结果我拷过来一看发现自己也不会。运

C语言循环链表,求指点!
昨天一个同学发来以下这段代码让我帮她改一下错,结果我拷过来一看发现自己也不会。运行的时候总会出现下图这种错误:C语言循环链表,求指导以下是代码,哪位大神有时间的话麻烦帮我看看好吗,谢谢了!


#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct preson
{
int number;
int data;
preson *next;
}PRE;
void main()
{
int n,m,i,a[MAXSIZE];
 PRE *p,*q,*head;
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
a[i]=i+1;
p=(PRE *)malloc(sizeof(PRE));
p->data=1;
head=p=q;
p->next=NULL;
while(n)
{
p=q;
q=(PRE *)malloc(sizeof(PRE));
q->data=a[i];
q->number=i+1;
p->next=q;
i++;
n--;
}
q->next=head;
p=head;
while(n!=0)
{
while(m!=1)
{
      if(p->data==0)p=p->next;
  else 
  {
        p=p->next;
m--;
  }
  printf("%4d%d\t",p->number,p->data);
}
m=p->data;
p->data=0;
n--;
}
} 循环链表 C
[解决办法]
不知道你的需求是什么,以下的程序是修改以后的,可以运行起来。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#define MAXSIZE 100

typedef struct preson{
int number;
int data;
struct preson *next;
} PRE;

int main()
{
int n, m, i, a[MAXSIZE];
PRE *p, *q, *head;
scanf("%d%d", &m, &n);
for(i=0; i<n; i++)
a[i] = i + 1;
p = (PRE *)malloc(sizeof(PRE));
assert(p);
p->data = 0;
p->number = 0;
head = q = p;
p->next=NULL;
i = 0;
while(i < n)
{
p = q;
q=(PRE *)malloc(sizeof(PRE));
assert(q);
q->data=a[i];
q->number=i+1;
p->next=q;
i++;
}

q->next=head;
p=head;
while(n!=0)
{
while(m!=1)
{
p=p->next;
if(p->data !=0)
{
m--;
}
printf("%4d%d\t",p->number,p->data);
}
m=p->data;
p->data=0;
n--;
}
return 0;
}

[解决办法]
#include<stdio.h>
#include<malloc.h>

#define MAXSIZE 100

typedef struct preson
{
int number;
int data;
preson *next;
}PRE;

void main()
{
int n,m,i,a[MAXSIZE];
 PRE *p,*q,*head;  // 定义指针时候同时初始化给NULL 
scanf("%d%d",&m,&n);
for(i = 0; i < n; i++)
 a[i] = i+1;
p=(PRE *)malloc(sizeof(PRE));
p->data=1;
//head = p = q; // p已经分配内存了, 又把它指向q, q的没有初始化,野指针而已,


              // 不明白你是想干什么?

head = q = p; // 这才是正确的 
p->next=NULL;
while(n)
{
p = q;
q=(PRE *)malloc(sizeof(PRE));
q->data=a[i];
q->number=i+1;
p->next=q;
i++;
n--;
}
q->next=head;
p=head;
        //  我表示也不晓得 楼主想干什么? 楼主最好把需求也贴出来吧
while(n!=0)  
{
while(m!=1)
{
      if(p->data == 0)
  p=p->next;
  else 
  {
  p = p->next;
m--;
  }
  printf("%4d%d\t",p->number,p->data);
}
m = p->data;
p->data = 0;
n--;
}
}


[解决办法]
改成这样吧。。

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef struct preson
{
int number;
int data;
preson *next;
}PRE;
void main()
{
int n,m,i,a[MAXSIZE];
PRE *p,*q,*head;
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
a[i]=i+1;
p=(PRE *)malloc(sizeof(PRE));
p->data=1;
p->number = 1;//number也要赋值。。
head= q = p;//这个顺序乱了。。
p->next=NULL;
i = 1;//
while(i < n)//这里不要用n--。。否则改动了n的值影响下边的循环。。
{
p=q;
q=(PRE *)malloc(sizeof(PRE));
q->data=a[i];
q->number=i+1;
p->next=q;
i++;
}
q->next=head;

p=head;
while(n!=0)
{
while(1)
{
if(p->data==0) p=p->next;
else 
{
if(m == 1){
printf("%4d %d\n",p->number,p->data);
m = p->data;
p->data = 0;
p = p->next;
--n;
break;
}
p=p->next;
m--;
}
}
}
}

[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。

热点排行
Bad Request.