我正在尝试在单个链表中存储多个数据项。我曾尝试过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;
}
答案 0 :(得分:2)
print()
函数
while (head!=NULL)
应该是
while (temp!=NULL)
答案 1 :(得分:2)
这是因为你不是在你的while循环中检查temp是否为null,而是检查head。将其更改为temp,它不会卡在循环中。
while(head!=NULL)
应该是
while(temp!=NULL)
答案 2 :(得分:1)
两个问题:
y
和float
中阅读int
,但变量的类型为float
。由于int
大于head!=NULL
,因此内存不应写入,导致未定义的行为。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)
添加上述答案后,您还可以在代码中修复其他两行: -
将指针头初始化为null。您应该在使用它们之前初始化所有指针,否则行为将是意外的。
struct node * head = NULL;
您应该在函数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