在单个链表中存储多个数据项

时间:2015-06-24 17:06:51

标签: c singly-linked-list

我正在尝试在单个链表中存储多个数据项。我曾尝试过2个数据项,程序符合无错误,插入数据也工作正常但程序在打印输出时停止。我无法弄清楚代码有什么问题。 任何帮助将不胜感激。

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

struct node{
    float a;
    float b;
    struct node *next;
};

struct node *head;

void insert(float x,float y){
    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->a = x;
    temp->b = y;
    temp->next = head;
    head= temp;
}
void print(){
    struct node *temp;
    temp= head;
    printf("\n the linked list is :");
    while(head!=NULL){
        printf("data is : %f %f",temp->a,temp->b);
        temp=temp->next;
    }
}

int main()
{
    int n,i,x,y;
    head = NULL;
    struct node *temp;
    printf("\n enter the  number of data to enter:");
    scanf("%d",&n);
    for(i=0;i<n;i++){
        printf("\n enter x-cordinate: \n");
        scanf("%f",&x);
        printf("\n eter y-cordinate: \n");
        scanf("%f",&y);
        insert(x,y);
    }
    print();
    return 0;
}

6 个答案:

答案 0 :(得分:2)

print()函数

中有错误
while (head!=NULL)

应该是

while (temp!=NULL)

答案 1 :(得分:2)

这是因为你不是在你的while循环中检查temp是否为null,而是检查head。将其更改为temp,它不会卡在循环中。

while(head!=NULL) 

应该是

while(temp!=NULL)

答案 2 :(得分:1)

两个问题:

  1. 您正在yfloat中阅读int,但变量的类型为float。由于int大于head!=NULL,因此内存不应写入,导致未定义的行为。
  2. 打印结果时,您需要检查temp!=NULL而不是public class ArrayChunk<T> { // Array this chunk is from. private readonly T[,,] _parentArray; // Point of reference. private readonly int _x, _y, _z; // How many elements to move outwards in each direction from point of reference. private readonly int _numToExpand; public ArrayChunk(T[,,] parentArray, int x, int y, int z, int numToExpand) { _parentArray = parentArray; _x = x; _y = y; _z = z; _numToExpand = numToExpand; } public int Length => _numToExpand*2 + 1; public T this[int x, int y, int z] { get { // Make sure index is within chunk range. EnsureInChunkRange(x, y, z); // Map chunk index to parent array index. int parentX = MapToParent(_x, x), parentY = MapToParent(_y, y), parentZ = MapToParent(_z, z); // If parent array index is in parent array range, return element from parent array. if (IsInRangeOfParent(parentX, parentY, parentZ)) return _parentArray[parentX, parentY, parentZ]; // Otherwise return default element for type T. return default(T); } set { EnsureInChunkRange(x, y, z); int parentX = MapToParent(_x, x), parentY = MapToParent(_y, y), parentZ = MapToParent(_z, z); if (IsInRangeOfParent(parentX, parentY, parentZ)) _parentArray[parentX, parentY, parentZ] = value; else throw new InvalidOperationException(); } } private void EnsureInChunkRange(int x, int y, int z) { if (x < 0 || y < 0 || z < 0 || x >= Length || y >= Length || z >= Length) { throw new IndexOutOfRangeException(); } } private int MapToParent(int referenceIndex, int index) { return referenceIndex - _numToExpand + index; } private bool IsInRangeOfParent(int parentX, int parentY, int parentZ) { return parentX >= 0 && parentY >= 0 && parentZ >= 0 && parentX < _parentArray.GetLength(0) && parentY < _parentArray.GetLength(1) && parentZ < _parentArray.GetLength(2); } }

答案 3 :(得分:0)

在你的打印功能中,在while循环中你需要检查temp != NULL,因为那是你用来遍历列表的指针。

除此之外,我建议不要在列表中使用全局变量。将头指针作为函数的参数。

为了清楚起见,我还将temp重命名为更有意义的东西,比如迭代器,至少在你的打印函数中。

正如BLUEPIXY所指出的那样,你需要更改main中某些变量的类型,以反映你想要scanf阅读的内容。

答案 4 :(得分:0)

添加上述答案后,您还可以在代码中修复其他两行: -

  1. 将指针头初始化为null。您应该在使用它们之前初始化所有指针,否则行为将是意外的。

    struct node * head = NULL;

  2. 您应该在函数insert()中检查amlloc的返回值。如果内存分配失败,malloc()可以返回NULL。在malloc()返回NULL的情况下,取消引用NULL指针将导致程序崩溃。您可以像下面一样更改insert()。

    void insert(float x,float y){

    struct node *temp;
    temp = (struct node*)malloc(sizeof(struct node));
    
    if (!temp) {
        return;
    }
    
    temp->a = x;
    temp->b = y;
    temp->next = head;
    head= temp;
    

    }

答案 5 :(得分:-1)

上面的程序有一个小错误,在void print函数中,我们应该写表达式while(temp!= NULL)。

巴拉吉库马尔 29/11