标题:链表插入时while(p)和while(p->Next)有何不同
只看楼主
c834706901
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-10-12
结帖率:0
已结贴  问题点数:20 回复次数:4 
链表插入时while(p)和while(p->Next)有何不同


    #include "stdio.h"
    #include "stdlib.h"
    typedef struct List
    {
    int data;
    struct List *Next;
    }Node,*NodePtr;
    NodePtr ListPtr;

    void ListInsert(NodePtr L,int i)
    {
    NodePtr p;
    NodePtr q;
    p = L;
    while(p) //在这里我用 while(p)的话程序就会卡死在这里,如果用while(p->Next)就可以正常运行,请问是为什么
    {

    p = p->Next;

    }
    q = (Node*)malloc(sizeof(Node));
    q->data = i;

    p->Next = q;
    printf("111\n");
    p=q;
    p->Next = NULL;

    }
    void ListCreatTail(NodePtr L)
    {
    *L = (Node)malloc(sizeof(Node));
    (*L)->Next = NULL;
    }

    void ListDelete(NodePtr L, int i)
    {
    int j = 1;
    NodePtr p,q;
    p=L;
    while(p,j < i)
    {
    p=p->Next;
    ++j;
    }
    q=p->Next;
    p->Next = q->Next;
    free(q);

    }

    void ListPrintf(NodePtr L)
    {
    NodePtr p;
    p=L->Next;
    while(p)
    {
    printf("%d\n",p->data);
    p=p->Next;
    }
    }

    void main()
    {

    ListCreatTail(&ListPtr);
    ListInsert(ListPtr,1);
    ListInsert(ListPtr,2);
    ListInsert(ListPtr,3);
    ListInsert(ListPtr,4);
    ListInsert(ListPtr,5);
    ListDelete(ListPtr,2);
    ListPrintf(ListPtr);
    }
搜索更多相关主题的帖子: while int Next void Node 
2019-10-12 14:59
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
好复杂呀,看不懂。

程序代码:
#include <stdio.h>
#include <stdlib.h>

struct List
{
    int data;
    struct List* next;
};

void List_Insert( struct List** proot, int data )
{
    struct List** p;
    for( p=proot; *p; p=&(*p)->next );
    *p = malloc( sizeof(**p) );
    (*p)->data = data;
    (*p)->next = NULL;
}

void List_Print( struct List** proot )
{
    for( struct List* p=*proot; p; p=p->next )
        printf( "%d%c", p->data, p->next?' ':'\n' );
}

int main( void )
{
    struct List* root = NULL;
    List_Print( &root ); // 此时 root 为空,因此无输出

    List_Insert( &root, 1 );
    List_Insert( &root, 2 );
    List_Print( &root ); // 此时应当输出 1 2
}

2019-10-12 17:16
xhxh
Rank: 2
等 级:论坛游民
威 望:2
帖 子:17
专家分:31
注 册:2019-2-20
得分:7 
    while (p->Next) 为null  里面不执行   while(p) 为true      p->Next 没有创建   


[此贴子已经被作者于2019-10-12 20:27编辑过]

2019-10-12 20:15
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
得分:7 
程序代码:
#include <stdio.h>
#include <stdbool.h>
#include <malloc.h>
typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode, * LinkList;
LinkList CreateLinklistRear()
{
    int x, i, nodeNum;
    LinkList head, rear, temp;  // 定义头结点、尾结点和临时结点
    head = (LinkList)malloc(sizeof(LNode));  // 生成表头结点,表头结点不存放数据
    head->next = NULL;  // 将表头结点的指针域赋值为NULL
    rear = head;  // 将表头结点赋值给表尾结点
    scanf("%d", &x);
    while (x != 0) //输入0时终止输入
    {
        temp = (LinkList)malloc(sizeof(LNode));  // 生成新的结点
        temp->data = x;   // 新增结点的数据域
        temp->next = NULL; // 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
        rear->next = temp; // 使前一个结点指向新增结点(head->next=temp)
        rear = temp;  // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
        scanf("%d", &x);
    }
    return head;  // 返回头结点
}
bool ListPut(LinkList L)
{
    LinkList p = L->next;
    if (p == NULL)
        return false;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    return true;
}
int main(void)
{
    LinkList L = CreateLinklistRear();
    ListPut(L);
    return 0;
}


[此贴子已经被作者于2019-10-12 22:04编辑过]


宝剑锋从磨砺出,梅花香自苦寒来。
2019-10-12 22:01
c小白2333
Rank: 5Rank: 5
来 自:中国
等 级:贵宾
威 望:11
帖 子:121
专家分:367
注 册:2019-6-17
得分:0 
楼主的原程序问题很多
NodePtr ListPtr;
不能直接用于main函数的
ListCreatTail(&ListPtr); 会报错没有初始化
这里
    p = L;
    while(p) //在这里我用 while(p)的话程序就会卡死在这里,如果用while(p->Next)就可以正常运行,请问是为什么
while循环运行后 p = NULL
此时下面的
p->Next = q;
没有意义出错  所以只能用while(p->Next)
这样结束后p->Next = NULL
程序可以运行下去
仅个人观点  应该是这样

宝剑锋从磨砺出,梅花香自苦寒来。
2019-10-12 22:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497216-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018600 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved