设计一算法,逆置带头结点的动态单链表L

2024-11-15 03:53:45
推荐回答(1个)
回答1:

#include
#include
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *creatlistr()
{
// datatype elem;
int n;
linklist *head,*s,*r;
head=(linklist *)malloc(sizeof(linklist));
r=head;
printf("请输入要插入的结点的个数:");
scanf("%d",&n);
printf("请输入%d个结点:",n);
while(n--)
{
s=(linklist *)malloc(sizeof(linklist));
scanf("%d",&s->data);
r->next=s;
r=s;
}
r->next=NULL;
return head;
}
void reverseLinklist(linklist *head)
{
linklist *y,*r,*t;
t=NULL;
r=NULL;
y=head->next;
head->next=NULL; //断开头指针
while(y!=NULL) //从第一个结点起,将后边的结点依次放到最前边,实现逆置
{
t=y->next;
y->next=r;
r=y;
y=t;
}
head->next=r; //重新链接上头结点,保证最初链的完整
}
void show(linklist *head)
{
linklist *p;
p=head->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
}
int main()
{
linklist *head;
head=creatlistr();
reverseLinklist(head);
show(head);
printf("\n");
return 0;
}