您好,这里是一个“新手C”开发人员,我正在寻找一些帮助,以将此用Pascal编写的程序转换为C:
type T = ^list;
list=record
info: integer;
next: T;
end;
var
L,P: T; i,ui,n: integer;
begin
write('Enter number of elements in your list: '); readln(n);
writeln;
New(L); //Creating a node
P := L; //assining P as a pointer
i:= 1;
while (i <= n) do
begin
writeln('enter a number: '); readln(ui);
P^.info:= ui;
new (P^.next); // creat a second node and automaticaly chain it to the previous one which means
P^.next:= new created P
P:= P^.next;
i:= i + 1;
end;
P^.next:= nil;
P:= L;
writeln('your list looks like this: ');
while (P <> nil) do
begin
write(P^.info,' ');
P:= P^.next;
end;
readln;
end.
这个程序使用正向链接技术使用while循环创建一个链表,这意味着它仅创建一个节点,并使用它创建其他节点并在循环内自动链接它们。 此代码在C中的等效内容如下:
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *prev,*head,*p;
int n,i;
printf ("number of elements:");
scanf("%d",&n);
head=NULL;
for(i=0;i<n;i++)
{
p=malloc(sizeof(struct node));
scanf("%d",&p->data);
p->next=NULL;
if(head==NULL)
head=p;
else
prev->next=p;
prev=p;
}
return 0;
}
我的问题是我想在C中创建相同的代码,但是我找不到我前面提到的“自动链接”的解决方案,特别是我正在寻找一种方法来编写以下指令: C:
new(P^.next);
该指令所做的基本上是创建另一个节点并将其链接到上一个节点,而不是创建一个临时节点,然后自己编写链接代码,就像您在说:
P^.next:= new created node;
我可能会更详细,我想知道如何在C中替换此代码:
if(head==NULL)
head=p;
else
prev->next=p;
prev=p;
并编写一条简单的指令,例如pascal中的on
new(P ^ .next);
答案 0 :(得分:0)
如果我阅读了此权利,P^
被取消引用。也就是说,它指向它所指向的对象。
要在c中执行此操作,只需执行以下操作:
*P
所以,在Pascal中:
P^.next
成为C语言:
(*p).next
或者,如果愿意,可以使用C的缩写:
p->next
答案 1 :(得分:0)
我相当确定:
if(head==NULL)
head=p;
else
prev->next=p;
prev=p;
与此不同:
new(P^.next);
但是如果您希望使用new(P^.next);
的等效项,则可以使用malloc
来分配内存:
p->next = malloc(sizeof(*p->next));
您应该确保检查malloc
返回的指针是否也是NULL
:
if(!p->next)
{
perror("malloc()");
return EXIT_FAILURE;
}