来自链接列表的Printf

时间:2014-10-09 16:51:41

标签: c printf singly-linked-list

尝试创建用于存储值的单个链接列表。 使用rank作为全局占位符,但每次递增时都尝试打印出值。

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



typedef struct Skill
{
    int rank;
    struct node *nextSkill;

}node;

node * addSkills(node * head);
node * createNode(node * new);

int rank = 0;

int main(void)
{
    int x;
    node * head = NULL;
    for (x = 0; x < 2; x ++)
    {
        head = addSkills(head);
        rank++;
    }
}

node * addSkills(node * head)
{
    node * newSkill = createNode(head);
    head = newSkill;
    return head;
}

node * createNode(node * new)
{
    node * newNode = calloc(1,sizeof(node));
    if(newNode == NULL)
    {
        printf("Memory Allocation Error\n");
        exit(2);
    }
    newNode->rank = rank;
    newNode->nextSkill = new;
    return newNode;
}

void traverse(node * head)
{
    node * conductor = head;
    while(conductor != NULL)
    {
        printf("%d", conductor->rank);  
        conductor = conductor->nextSkill;
    }
}

不确定我创建链接列表的方法是否错误,但我找不到原因?

3 个答案:

答案 0 :(得分:0)

您不会致电traverse。因此,不会生成任何输出。

答案 1 :(得分:0)

您预先设定的代码是新创建的节点。这就是为什么在1的节点之前获得0节点的原因。如果你想附加它们,你可以使用:

node * addSkills(node * head)
{
   node* temp = NULL;

   if ( head == NULL )
   {
      head = createNode();
      return head;
   }

   temp = head;
   while ( temp->nextSkill != NULL )
   {
      temp = temp->nextSkill;
   }

   node * newSkill = createNode();
   temp->nextSkill = newSkill;

   return head;
}

node * createNode()
{
   node * newNode = calloc(1,sizeof(node));
   if(newNode == NULL)
   {
      printf("Memory Allocation Error\n");
      exit(2);
   }
   newNode->rank = rank;
   return newNode;
}

答案 2 :(得分:0)

让我们以这种方式正确地推断您的数据结构:

struct pointer
            {
            int field; 
            struct pointer *link; 
            };
typedef struct pointer cell;

要创建链接列表,此功能正常工作:

cell *create_my_linked_list()
    {

    int n;  /* number of elements to type */
    int i;  
    int number; /*the values to input*/
    cell *ptr; /* tmp pointer */

    do
     {
     clrscr();
     cout<<"\tWhat is the length of the elements you want to create ? ";
     cin>>n;



    for(i=0;i<n;i++)
      {
         ptr=(cell*)malloc(sizeof(cell));
         cout<<"Type a number:  ";
         scanf("%3d",&number);
         ptr->field=number;      
         ptr->link=head;         
         head=ptr;
      }
        return head;
      }

要显示您的链接列表,请使用以下简单功能:

void display()
        {
        cell*node=head;
        if(node==NULL)
          {
          cout<<" The linked list is empty !";
          }else
              {   cout<<" VThis is your list \n";
                    while(node!=NULL)
                      {
                      printf("%3d",node->field);
                      node=node->link;
                      }
              }
          }

上面的第一个函数正确创建链接列表但它还原它。它还假设您提前知道链表的长度,就像数组一样。为避免这一切,请使用此功能:

cell* create_a_linked_list_without_inverting_it()
    {

     cell*precedent=NULL;  

     cell*actual=NULL;     
     int datum;
     int err;

     do
      {
      cout<<" Type a number (or a letter to end) :  ";
      err=scanf("%d",&datum);
      if(err<=0) break; 
      actual=(cell*)malloc(sizeof(cell));
      actual->field=datum;
      if(precedent==NULL)
         {
         head=actual;
         }else
            {
            precedent->link=actual;
            }
      precedent=actual;
        }while(1);  
      actual->link=NULL;
      return head;
      }

我希望这会有所帮助。 Begueradj:)