C语言中一个很奇怪的问题
typedef struct LNode
{
ElemType data;
int count;
struct LNode *next;
}LNode,*LinkList;
LinkList InsertLnode(LinkList &L,int loc,ElemType m)
{
LinkList p3,p2,p1;
p1=L;
p3=L;
}
这是我程序的一部分,其中的p1,p3位置完全一样,但是p3得到分配地址,但是p1却没得到地址。是我调试的时候发现的。
为了让大家看的清楚我把代码简化了
完整如下
#include<stdio.h>
#include<malloc.h>
#define ElemType int
#define NULL 0
int n=0;
typedef struct LNode
{
ElemType data;
int count;
struct LNode *next;
}LNode,*LinkList;
//初始化单链表
LinkList InnitLinkList(LinkList &L)
{
char *str;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->count=0;
str="初始化成功";
printf("%s",str);
return L;
}
//项链表中插入新元素的函数
LinkList InsertLnode(LinkList &L,int loc,ElemType m)
{
char*str;
LinkList p3,p2,p1;
p1=L;
p3=L;
if(loc<1||loc>n+1)
{
str="插入位置不合法\n";
printf("%s",str);return L;
}
else
{
p2=(LinkList)malloc(sizeof(LNode));
//scanf("%d",&p2->data );
p2->data =m;
p2->count=loc;
while((p1->count)!=loc)
{
p3=p1;
p1=p1->next;
}
p2->next =p3->next;
p3->next =p2;
while(p2->next!=NULL)
{
p2->count=p2->count+1;
p2=p2->next;
}
str="插入数据成功\n";
printf("%s",str);
n=n+1;
return L;
}
}
//在单链表中删除元素
LinkList DeleteLinkList(LinkList &L,int loc)
{
char*str;
LinkList p1,p2;
p1=p2=L;
if(loc<1||loc>n)
{
str="删除位置非法\n";
printf("%s",str);
return L;
}
else
{
/* if(loc==n)
{
while(p1->count!=loc)
{
p2=p1;
p1=p1->next;
}
p2->next =NULL;
}
else
{*/
while(p1->count!=loc)
{
p2=p1;
p1=p1->next;
}
p2->next=p1->next;
/*}*/
while(p2->next!=NULL)
{
p2=p2->next;
p2->count=p2->count+1;
}
n=n-1;
str="删除成功\n";
printf("%s",str);
return L;
}
}
//输出单链表函数
void ShowList(LinkList &L)
{
LinkList p1;
p1=L;
while(p1->next!=NULL)
{
p1=p1->next ;
printf("%d",p1->data);
}
}
void main()
{
char *str;
LinkList linklist;
InnitLinkList(linklist);
str="如果您想向单链表中插入元素请按1\n\n";
printf("%s",str);
str="如果您想从链表中删除某元素请按2\n\n";
printf("%s",str);
str="如果您想输出链表中全部元素请按3\n\n";
printf("%s",str);
str="如果您想现在退出该程序请按0命令\n\n";
printf("%s",str);
for(int i=1;i!=0;)
{
int comm;
str="请输入要执行的命令\n";
printf("%s",str);
scanf("%d",&comm);
switch(comm)
{
case 1:{
int loc,val;
str="请输入插入的元素的位置loc\n";
printf("%s",str);
scanf("%d",&loc);
if(loc<1||loc>n+1)
{
str="插入位置不合法\n";
printf("%s",str);
}
else
{
str="请输入插入的元素值val\n";
printf("%s",str);
scanf("%d",&val);
InsertLnode(linklist,loc,val);
}
}
break;
case 2:{
int loc;
str="请输入删除的元素的位置loc\n";
printf("%s",str);
scanf("%d",&loc);
DeleteLinkList(linklist,loc);
}
break;
case 3:ShowList(linklist);
break;
default:ShowList(linklist);
}
i=comm;
}
}
[解决办法]
你还是把关键代码给压缩出吧 不然没人看啊
[解决办法]
(gdb) p p1
$3 = 0x7fffe6f0
(gdb) p p3
$4 = 0x7fffe6f0
没发现你的问题
[解决办法]
楼主,写链表程序,把结点画出来,易于理解和找错