求大神帮小弟我看看链表有关问题
求大神帮我看看链表问题
#include<stdio.h>
#include<stdlib.h>
typedef struct _node
{
int val;
struct _node* next;
}Node;
void list_insert(Node** head_addr,int pos,int new_val)
{
Node *t,*newN,*p1,*p2;
int i;
newN=(Node *)malloc(sizeof(Node));
t=*head_addr;p1=*head_addr;p2=*head_addr;
if(*head_addr==NULL)
*head_addr=newN;
else if(pos==0) {*head_addr=newN;(*head_addr)->next=t->next;return; }
else
for(i=1;i<=pos;i++) { p2=p1;p1=p1->next; }
p1=newN;
p1->val=new_val;
p2->next=p1->next;
}
void list_reverse(Node** head_addr)
{
int k;
Node *p1,*p2,*p3,*p;
k=1;
p1=*head_addr;p2=*head_addr;p3=*head_addr;
while(p1!=NULL)
{
if(p3==*head_addr){ p3=p2;p2=p1;p1=p1->next; }
else { if(k){ p=NULL;k=0;} p3->next=p;p=p3;p3=p2;p2=p1;p1=p1->next; }
}
p2->next=p3;p1->next=p2;*head_addr=p1;
}
void main()
{
int i,n,pos,val;
Node* head, *thisN,*newN;
head=NULL;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
newN=(Node*)malloc(sizeof(Node));
if(head==NULL)
{
head=newN;
thisN=head;
}
else
{
thisN=head;
while(thisN!=NULL)
thisN=thisN->next;
thisN=newN;
}
scanf("%d",&thisN->val);
thisN->next=NULL;
}
scanf("%d%d",&pos,&val);
list_insert(&head,pos,val);
/*list_reverse(&head);*/
}
为什么reverse函数会崩溃?
------解决方案--------------------
我只看了main函数,其它函数还没帮你看。似乎main函数中的for循环中有错
在for循环中,用函数malloc()为n个Node类型结构体变量申请了内存,但是,这n个结构体变量并没有形成一个链表(它们的成员变量next的值全为NULL)
问题可能出在for循环下的else语句中。
可以将else语句改为
------解决方案--------------------
提醒一下,你的代码写得太乱了
随便copy一段:
若干条语句挤在一行,也没有缩进,很多人看到这样的代码就不想读下去了
------解决方案--------------------
变量地址→指针→链表
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
#include<stdio.h>
#include<stdlib.h>
typedef struct _node
{
int val;
struct _node* next;
}Node;
void list_insert(Node** head_addr,int pos,int new_val)
{
Node *t,*newN,*p1,*p2;
int i;
newN=(Node *)malloc(sizeof(Node));
t=*head_addr;p1=*head_addr;p2=*head_addr;
if(*head_addr==NULL)
*head_addr=newN;
else if(pos==0) {*head_addr=newN;(*head_addr)->next=t->next;return; }
else
for(i=1;i<=pos;i++) { p2=p1;p1=p1->next; }
p1=newN;
p1->val=new_val;
p2->next=p1->next;
}
void list_reverse(Node** head_addr)
{
int k;
Node *p1,*p2,*p3,*p;
k=1;
p1=*head_addr;p2=*head_addr;p3=*head_addr;
while(p1!=NULL)
{
if(p3==*head_addr){ p3=p2;p2=p1;p1=p1->next; }
else { if(k){ p=NULL;k=0;} p3->next=p;p=p3;p3=p2;p2=p1;p1=p1->next; }
}
p2->next=p3;p1->next=p2;*head_addr=p1;
}
void main()
{
int i,n,pos,val;
Node* head, *thisN,*newN;
head=NULL;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
newN=(Node*)malloc(sizeof(Node));
if(head==NULL)
{
head=newN;
thisN=head;
}
else
{
thisN=head;
while(thisN!=NULL)
thisN=thisN->next;
thisN=newN;
}
scanf("%d",&thisN->val);
thisN->next=NULL;
}
scanf("%d%d",&pos,&val);
list_insert(&head,pos,val);
/*list_reverse(&head);*/
}
为什么reverse函数会崩溃?
------解决方案--------------------
我只看了main函数,其它函数还没帮你看。似乎main函数中的for循环中有错
for(i=1;i<=n;i++)
{
newN=(Node*)malloc(sizeof(Node));
if(head==NULL)
{
head=newN;
thisN=head;
}
else
{
thisN=head;
while(thisN!=NULL)
thisN=thisN->next;
thisN=newN;
}
scanf("%d",&thisN->val);
thisN->next=NULL;
}
在for循环中,用函数malloc()为n个Node类型结构体变量申请了内存,但是,这n个结构体变量并没有形成一个链表(它们的成员变量next的值全为NULL)
问题可能出在for循环下的else语句中。
可以将else语句改为
else//在链表尾部插入新结点
{
thisN->next=newN;
thisN=newN;
}
------解决方案--------------------
提醒一下,你的代码写得太乱了
随便copy一段:
t=*head_addr;p1=*head_addr;p2=*head_addr;
if(*head_addr==NULL)
*head_addr=newN;
else if(pos==0) {*head_addr=newN;(*head_addr)->next=t->next;return; }
若干条语句挤在一行,也没有缩进,很多人看到这样的代码就不想读下去了
------解决方案--------------------
变量地址→指针→链表
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。