给定程序中,函数invertList的功能是将不带头结点的单向链表逆置。即若原链表结点数据域依次为:2,4,6,8,10,逆置后,从头至尾结点数据域依次为10,8,6,4,2。程序代码如下:#include<stdio.h> #include<stdlib.h> #define N 80 typedef struct node{ int data; struct node *next; }NODE; NODE *invertList(NODE *h) { /********Begin********/ return p; /********End********/ } NODE *creatList(int a[],int n) { NODE *h,*p,*q; int i; h=NULL; for(i=0;i<n;i++) { q=(NODE*)malloc(sizeof(NODE)); q->data=a[i]; q->next=NULL; if(h==NULL)h=p=q; else { p->next=q; p=q; } } return h; } void outList(NODE *h) { NODE *p; p=h; if(p==NULL)printf("The list is NULL!\n"); else { printf("Head"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } int main(){ NODE *head; int a[N],i,n; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } head=creatList(a,n); outList(head); head=invertList(head); outList(head); return 0; } 请补全上述代码
时间: 2024-04-07 13:30:06 浏览: 114
给定一个不带头结点的单链表,写出将链表倒置的算法
5星 · 资源好评率100%
补全的代码如下所示:
```c
NODE *invertList(NODE *h)
{
NODE *p, *q, *r;
p = h;
q = NULL;
while (p != NULL)
{
r = p->next;
p->next = q;
q = p;
p = r;
}
return q;
}
```
在这个函数中,我们使用了三个指针p、q和r。p指向当前节点,q指向已经逆置好的链表头部,r用于保存p的下一个节点。在每一次循环中,我们将p的下一个节点保存到r中,然后将p的next指针指向q,然后将q指向p,最后将p指向r。这样就完成了链表的逆置操作。
请注意,在主函数的逻辑中,你需要调用`outList`函数输出逆置前和逆置后的链表。
阅读全文