赞
踩
写出将单链表逆置的算法。即令单链表的第一个结点变为最后一个结点,第二个结点变为倒数第二个结点,…,最后一个结点变为第一个结点。
依次从键盘读入数据,逆序建立链表L;
逆置链表L(创建新的链表New保存逆置的结点);
代码解析:
主函数int main():
定义链表的长度n;
调用CreateList函数创建长度为n的链表;
调用InvertList函数将链表内元素转置并输出;
定义链表的结构体类型为LNode,规定结点的数据域和结点的指针域
定义函数struct LNode *CreatList(int n)逆位序创建链表并输出所创建的链表的元素值。
定义需要创建的链表元素个数n;
建立一个带头结点的单链表;
逆序位输入指定元素个数的链表元素数值;
输入逆序位建立链表的链表元素;
定义函数void InverList(struct LNode *L)转置链表内元素并输出。
建立一个带头结点的新链表r;
q指向链表的第一个元素;
开辟新结点s,将q的值赋给s;
令s->next为NULL并使其成为r的后续结点;
利用while循环,将q不断后移,指向链表的后续元素。开辟新结点p,将q的值 赋给p,将p插入结点s和结点i中间;
令s的指针指向p;
输出转置后的链表;
- #include <stdio.h>
- #include <stdlib.h>
-
- //定义链表类型
- struct LNode{
- int data; //结点的数据域
- struct LNode *next; //结点的指针域
- };
-
-
- //创建逆序链表
- struct LNode *CreatList(int n)
- {
- struct LNode *L,*p;
- printf("请输入逆序创建链表的元素的个数:\n"); //确定链表元素的个数
- scanf("%d",&n);
- L = (struct LNode*)malloc(sizeof(struct LNode));
- L->next = NULL; //建立一个带头结点的单链表
- printf("请输入逆序链表元素:\n");
- while(n--){ //逆序位输入n个元素的数值
- p=(struct LNode*)malloc(sizeof(struct LNode));
- scanf("%d",&p->data ); //输入指定元素个数的链表元素数值
- p->next = L->next ;
- L->next =p;
- }
- printf("输出链表中的元素:\n"); //直接输出所创建的逆序链表
- while(p!=NULL)
- {
- if(p->next ==NULL)
- printf("%d\n",p->data );
- else
- printf("%d\t",p->data );
- p=p->next ;
- }
- return L;
- }
-
-
- //转置链表内元素并输出
- void InvertList(struct LNode *L)
- {
- struct LNode *p,*q,*r,*s,*t;
- r = (struct LNode*)malloc(sizeof(struct LNode));
- s = (struct LNode*)malloc(sizeof(struct LNode));
- r->next=NULL; //建立一个带头结点新链表
- q=L->next; //q指向链表第一个元素
- s->data=q->data;
- s->next=NULL;
- r->next=s;
- while(q->next !=NULL)
- {
- q=q->next;
- p = (struct LNode*)malloc(sizeof(struct LNode));
- p->data=q->data;
- p->next=s;
- r->next=p;
- s=p;
- }
- printf("输出转置后的链表:\n");
- t=r->next;
- while(t!=NULL) //直接输出转置后的链表
- {
- printf("%d\t",t->data );
- t=t->next ;
- }
- printf("\n");
- }
-
-
- //主函数
- int main()
- {
- int n;
- struct LNode *L;
- L=CreatList(n);
- InvertList(L);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。