C语言链表原理

Python022

C语言链表原理,第1张

每个节点有一个数据域num保存该节点的数据,以及一个next域指向下一个节点的地址。假设某时刻指针p指向链表头结点,通过一个循环不停地将p赋值为p指向的节点的next域的值,即该节点的下一个节点的地址,即可遍历整个列表。

struct student *del(struct student *head,int n)

{

struct student *p,*q

p=head

while(n!=p->num&&p->next!=NULL)

{q=p

p=p->next}

if(n==p->num)//把这改成if(n==q->num)  p在上面找到num为n的节点后已经向后移动了,不能再判断了

{

if(p=head)//这块也有问题 虽然我不知道你想干嘛 但是你肯定想用==判断的 而不是赋值,同样这块应该用的也是q 而不是p

head=p->next

else

q->next=p->next

free(p)

}

return(head)

}

其他的还没看出来  因为你这代码就这么多 也没法调试

for(p1=headp1<head+np1++)

printf("%d ",p1->num)

这步有点问题。

其中p1++隐含的假设是链表所有元素是像数组一样在内存中连续存放的。

但是按照前面的代码,所有元素的内存是通过malloc动态分配的,因此p1++并不能移动到下一个元素处。

并且,既然是链表的实现,应该充分利用链表的next指针。

可以重写如下:

p1=head

for(i=0i<n++i)

{

printf("%d ",p1->num)

p1=p1->next

}