链接列表始终显示为空

时间:2019-07-14 16:28:14

标签: c data-structures

  

需求/问题2
  在计算中,进程标识符(通常称为进程ID或PID)是大多数操作系统内核用来唯一标识活动进程的数字。 PID通常是按顺序分配的,从0开始,直到每个系统的最大值都增加。创建一个链接列表来存储PID。要创建新的PID,请使用createPID()函数。

     

使用insertPID()函数将每个PID插入到列表的开头。处理完成后,使用deletePID()函数删除该特定的PID。

     

将根据以下标准进行评估:

     
      
  1. 正确编写C代码及其结构
  2.   
  3. 程序的编译和执行能力
  4.   
  5. 实施正确的编程技术
  6.   
  7. 完整的文档并正确提交
  8.   
     

注意:您必须为此分配编写C编程代码。

我已经创建了一个代码:

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

struct node
{
    int info;
    struct node *link;
};

void createPID ();
void insertPID (struct node *start,int x);
struct node * deletePID (struct node * start,int x);
void displayPID(struct node *start);
struct node * start;

int main()
{
    createPID();
    insertPID(start,0);
    insertPID(start,1);
    insertPID(start,2);
    displayPID(start);
    start=deletePID(start, 3);
    displayPID(start);

}

void createPID(){
    struct node *start = NULL;
}


void displayPID(struct node *start)
{
    struct node *p;
    if(start == NULL)
    {
        printf("List is empty\n");
        return;

    }
    printf("List is :");
    p=start;
    while(p!=NULL)
    {
        printf("%d\t",p->info);
        p=p->link;
     } 
     printf("\n");
}
/*End of displayList()*/

void insertPID(struct node * start, int data)
{
    struct node *temp,*p;

    p=start;
    while (p!=NULL)
    {
        if(p->link==NULL)
        break;
        p=p->link;
    }
    temp=(struct node *)malloc (sizeof (struct node));
    temp->info=data;
    if(p==NULL)
    start=temp;
    else
    {
    temp->link= p->link;
    p->link= temp;
    }
}

struct node* deletePID(struct node * start,int x){
    struct node *temp, *p;
    if(start == NULL)
    {
        printf("List is empty\n");
        return start;
    }
    /*Deletion of first node */
    if(start->info == x)
    {
        temp=start;
        start= start->link;
        free(temp);
        return start;
    }

    /*Deletion in between or at the end */
    p=start;
    while (p->link != NULL)
    {
        if (p-> link -> info== x)
        break;
        p=p->   link;
    }
    if(p->link==NULL)
    printf("Element %d not in list \n\n",x);
    else 
    {
        temp=p->link;
        p->link=temp->link;
        free (temp);
    }
    return start;

}

结果始终为空列表。需要帮助找出问题所在吗?

1 个答案:

答案 0 :(得分:-1)

问题在insertPID函数中。 start作为函数的参数是局部变量,它隐藏全局start和下面的行

start = temp;

仅修改本地start,全局start不受影响,并且始终为NULL。

如果要更新start指针,则需要通过指针到指针传递它:

void insertPID (struct node **start,int x);
//...
insertPID(&start,0);
insertPID(&start,1);
insertPID(&start,2);
//...
void insertPID(struct node ** start, int data)
{
    //...
    p=*start;
    //...
    if(p==NULL)
        *start=temp;
    //...
}

void createPID(){
    struct node *start = NULL;
}

我假设此函数要将start(全局)设置为0?所以应该是:

void createPID(){
    start = NULL;
}

您的版本引入了本地start变量,因此全局变量不受影响。

但是这里createPID的调用是多余的,因为start作为全局变量在main开始执行之前被初始化为0。