none
C语言中一个很奇怪的问题 RRS feed

  • 问题

  • 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;
     
    }

    }
    2012年4月16日 13:41

答案

  • 我觉得问题在这

    while((p1->count)!=loc)
    {
    p3=p1;
    p1=p1->next;
    }

    p1->next 可能是空。


    麻烦把正确答案设为解答。

    • 已建议为答案 Helen Zhao 2012年4月19日 6:45
    • 已标记为答案 Helen Zhao 2012年4月24日 7:27
    2012年4月18日 2:20
    版主

全部回复

  • 有点意思。

    我来试试代码。。


    Please mark this reply as answer if it helps you! Thanks for your cooperation! Good Luck to you.

    2012年4月18日 2:08
  • 我觉得问题在这

    while((p1->count)!=loc)
    {
    p3=p1;
    p1=p1->next;
    }

    p1->next 可能是空。


    麻烦把正确答案设为解答。

    • 已建议为答案 Helen Zhao 2012年4月19日 6:45
    • 已标记为答案 Helen Zhao 2012年4月24日 7:27
    2012年4月18日 2:20
    版主