有两种方法:
一是:用头插法建立单链表,自然而然就实现了逆置的动态链表。
代码:
#include<stdio.h>
#include<malloc.h>
typedef int datatype;
typedef struct node
{datatype data;struct node * next;
}linklist;linklist *creatlistf()
{int n;linklist * head,*s;head=NULL;printf("请输入要插入的结点个数:");scanf("%d",&n);printf("请输入%d个结点:",n);while(n--){s=(linklist *)malloc(sizeof(linklist));scanf("%d",&s->data);s->next=head;head=s;}return head;
}void show(linklist *head)
{linklist *p;p=head;while(p!=NULL){printf("%4d",p->data);p=p->next;}
}
int main()
{linklist *head;head=creatlistf();show(head);printf("\n");return 0;
}
二是:1、尾插法建立单链表 2、逆置单链表
第2小步的过程是(以单链表 head->1->2->3->4->NULL为例):
- 断开head->1的指针
- 将2放到1前,此时 2->1->NULL
- 将3放到2前,此时 3->2->1->NULL
- 将4放到3前,此时 4->3->2->1->NULL
- 重新添加头结点head,实现逆置:head->4->3->2->1->NULL
代码:
#include<stdio.h>
#include<malloc.h>
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;
}