链接列表和数组

时间:2017-10-13 16:11:11

标签: c

我必须创建包含数组中所有非零值的链接列表并将其打印出来。但是,我的代码打印出数组中有多少非零元素的相同值。

创建链表和打印链表是两个独立的功能。

addLink函数创建链表

void addlink(DataPtr *start, int element, double value) {
    Data last = *start;
    Data newPtr;

    newPtr = malloc(sizeof(Data));
    newPtr->element = element;
    newPtr->usage = value;
    newPtr->next = NULL;

    if(*start == NULL) {
        *start = newPtr;
        return;
        newPtr->element = element;
        newPtr->usage = value;
        newPtr->next = NULL;
    }

    while(last->next != NULL) {
        last = last->nextPtr;
        last->next = newPtr;
        return;
    }
}

打印功能打印链表

void print(Data *start) {
    Data current = *start;

    while(current != NULL) {
        printf("%d ", current->element);
        printf("%.3lf", current->value);
        current = current->next;
    }
    printf("\n");
}

这就是我在主要方面的称呼方式

    for(k = 0; k < 50; k++) {
        if(values[k] != 0) {
            value = values[k];
            addlink(&start,k,value);
            print(&start);
        }
    }


   struct data{
int element;
double value;
struct data *next;
   };
  typedef struct data Data;
  typedef Data *DataPtr;

  DataPtr start = NULL;

2 个答案:

答案 0 :(得分:0)

正确的函数实现可以采用以下方式

int addlink( DataPtr *start, int element, double value ) 
{
    DataPtr newPtr = malloc(sizeof(Data));
    int success = newPtr != NULL;

    if ( success )
    {
        newPtr->element = element;
        newPtr->value = value;
        newPtr->next = NULL;

        while ( *start != NULL ) start = &( *start )->next;

        *start = newPtr;
    }

    return success;
}

如果要在列表的开头添加新元素,则该函数可能看起来像

int addlink( DataPtr *start, int element, double value ) 
{
    DataPtr newPtr = malloc(sizeof(Data));
    int success = newPtr != NULL;

    if ( success )
    {
        newPtr->element = element;
        newPtr->value = value;
        newPtr->next = *start;

        *start = newPtr;
    }

    return success;
}

至于你所展示的函数实现,它甚至不会编译。例如,在此代码段中

Data last = *start;
Data newPtr;

newPtr = malloc(sizeof(Data));

表达式*start的类型为DataPtr,而初始化变量last的类型为Data。变量newPtr存在同样的问题。

函数print可能看起来像

void print( DataPtr *start ) 
{
    for ( DataPtr current = *start; current != NULL; current = current->next )
    {
        printf("%d ", current->element);
        printf("%.3lf", current->value);
    }

    printf("\n");
}

它被称为

print( &start );

答案 1 :(得分:0)

以下是您的列表的正确实现:

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

typedef struct data {
    int element;
    double value;
    struct data *next;
} data_t;


void print(data_t *start);
void addlink(data_t **start, int element, double value);

int main()
{
    int values[50] = { 0 };
    int value = 0;
    int k;
    data_t *start = NULL;

    //Give values some value
    values[0] = 100;
    values[1] = 250;

    for(k = 0; k < 50; k++)
    {
        if(values[k] != 0)
        {
            value = values[k];
            addlink(&start,k,value);
            print(start);
        }
    }
}

void addlink(data_t **start, int element, double value)
{
    data_t *newPtr;

    newPtr = malloc(sizeof(data_t));

    newPtr->element = element;
    newPtr->value = value;
    *start = newPtr;

}
void print(data_t *start)
{
    data_t *current = start;

    while(current != NULL)
    {
        printf("%d ", current->element);
        printf("%f", current->value);
        current = current->next;
    }
    printf("\n");
}

你的DataPtr想法,并不好。 &#34; data_t&#34;实现通常是您在查看链接列表时会看到的内容。用这种方式实现最简单。

如果您尝试实施一个列表,将最新的data_t添加到列表的末尾...

查看http://www.learn-c.org/en/Linked_lists以获取进一步说明。