我试图实现链表,但无法弄清楚它没有显示预期结果的实际问题是什么?我试图通过在可疑的地方放置随机printfs
来跟踪程序的控制流......
我试图跟踪控件,并意识到在插入第一个节点后,更改不会反映在原始链表中;回到main()
后,链表再次为空!
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *link;
};
int count(struct node *q);
void append(struct node *q, int item);
void display(struct node *q);
void add_after(struct node *q, int item, int pos);
void add_beg(struct node *q, int item);
int delete(struct node *q);
int main()
{
struct node *p = NULL;
int item,count,i;
printf("Enter the element to insertn");
scanf("%d",&item);
append(p,item);
printf("Controln");
printf("%d",p);
display(p);
//printf("No. of elements in Linked list = %d",count(p));
// printf("Enter number of elements: ");
// scanf("%d", &count);
// for (i = 0; i < count; i++)
// {
// printf("Enter %dth element: ", i);
// scanf("%d", &item);
// append(p,item);
// }
//printf("No. of elements in Linked List are : %d",count(p));
return 0;
}
void append(struct node *q, int item)
{
struct node *temp=NULL , *new=NULL;
temp = (struct node *)malloc(sizeof(struct node));
if(q==NULL) //Condition for empty linked list
{
// procedure to insert first node
temp->data = item;
temp->link = NULL;
q = temp;
//printf("iz here");
}
else
{
//printf("ABCDn");
temp = q;
while(temp->link!=NULL)
temp = temp->link;
new = (struct node *)malloc(sizeof(struct node));
new->data = item;
new->link = NULL;
temp->link = new;
}
}
void display(struct node *q)
{
// printf("Hitesh");
//printf("%d",q);
while(q->link!=NULL)
{
printf("%d->",q->data);
q = q->link;
}
}
int count(struct node *q)
{
int c=0;
while(q->link!=NULL)
{
q=q->link;
c++;
}
return c;
}
void add_after(struct node *q, int item, int pos)
{
int i;
struct node *temp , *new ;
temp=q;
for(i=0;i<pos;i++)
temp = temp->link;
new=(struct node*)malloc(sizeof(struct node));
new->data = item;
new->link = temp;
temp = new;
q = temp;
}
void add_beg(struct node *q, int item)
{
struct node *temp;
temp=q;
temp=(struct node*)malloc(sizeof(struct node));
temp->data = item;
temp->link = q;
q=temp;
}
注意:我没有从代码中清除注释,以便您可以看到我做了哪些事情来检查正在发生的事情。
这些函数
void append(struct node *q, int item);
void add_after(struct node *q, int item, int pos);
void add_beg(struct node *q, int item);
按值将指针传递到节点。因此,函数中指针的任何更改都不会影响原始指针。
你应该声明这样的函数
void append(struct node **q, int item);
void add_after(struct node **q, int item, int pos);
void add_beg(struct node **q, int item);
例如,函数append
可以按以下方式定义
int append( struct node **head, int item )
{
struct node *new_node = malloc( sizeof( struct node ) );
int success = new_node != NULL;
if ( success )
{
new_node->data = item;
new_node->link = NULL;
while( *head != NULL ) head = &( *head )->link;
*head = new_node'
}
return success;
}
并被称为喜欢
struct node *head = NULL;
//...
append( &head,item );
这些功能
void display(struct node *q)
{
// printf("Hitesh");
//printf("%d",q);
while(q->link!=NULL)
{
printf("%d->",q->data);
q = q->link;
}
}
int count(struct node *q)
{
int c=0;
while(q->link!=NULL)
{
q=q->link;
c++;
}
return c;
}
也无效,因为没有检查指针q
是否等于NULL
。
可以通过以下方式定义它们
void display( struct node *head )
{
for ( ; head != NULL; head = head->link )
{
printf( "%d->", head->data );
}
}
size_t count( struct node *head )
{
size_t n = 0;
for ( ; head != NULL; head = head->link )
{
++n;
}
return n;
}