#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
}node;
struct node *creat(int n) //创建链表
{
struct node *head,*p,*s;
int i;
p=head=(struct node *)malloc(sizeof(struct node));
for(i=1;i<=n;i++)
{
s=(struct node *)malloc(sizeof(struct node));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
void reverse(struct node *head)//原地置换
{
struct node *p,*s,*t;
p=head;
s=p->next;
while(s->next!=NULL)//主要置换过程
{
t=s->next;
s->next=p;
p=s;
s=t;
}
s->next=p;
head->next->next=NULL;//收尾
head->next=s;//赋头
}
void display(struct node *head)//显示链表内容
{
struct node *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void main()
{ int n;
struct node *head;
printf("请输入链表节点数:");
scanf("%d",&n);
head=creat(n);
printf("原链表:\n");
display(head);
reverse(head);
printf("置换后链表:\n");
display(head);
}
用c语言实现单链表的逆置的方法:
p=head;
s=p->next;
while(s->next!=NULL)
t=s->next;
s->next=p;
s=t;
s->next=p;
head->next->next=NULL;
head->next=s;
p=head; //p最开始指向头结点
s=p->next; //s最开始指向第一个节点
while(s->next!=NULL)//只要没有到最后一个元素就继续。最后一个元素的next肯定为NULL
{ t=s->next; //用t指向s后面的那个元素
s->next=p; //把s指向她前面那个,这个时候就实现了逆向了。而且是就地逆向。元素都没有动的
p=s; //然后p向后移动s
s=t; //s向后移动到p
这样到下一轮的时候又可以讲下下个再指向刚才那个下一个。一次内推}
s->next=p; //当最后一个的时候,还是要指向她的前一个。
head->next->next=NULL;//头指针的下一个是指向原来的第一个。逆向后肯定是最后的那个了。所以最后的一个的next=NULL就明了了。
head->next=s;//s是逆序前的最后一个,逆序后是第一个,所以用头指向他。
用c语言实现单链表的逆置,能将此程序详细的解释一下吗?
s->next=p; \/\/当最后一个的时候,还是要指向她的前一个。head->next->next=NULL;\/\/头指针的下一个是指向原来的第一个。逆向后肯定是最后的那个了。所以最后的一个的next=NULL就明了了。head->next=s;\/\/s是逆序前的最后一个,逆序后是第一个,所以用头指向他 画个图好好体会下,楼主!
下面是用c语言编写的对不带头结点的单链表进行就地逆置的算法,求大神...
void reverse(linklist &L){ linklist p = NULL, q = L; while(q != NULL){ L = q->next; \/\/ 保留下一个节点 q->next = p; p = q; q = L; \/\/ 移动到下一个节点 } L = p; \/\/ 指向逆置后的头节点} ...
用C语言编写线性表的逆置的程序.
void Output(struct list *head){ \/\/用于将链表每个节点显示出来 while(head!='\\0'){ printf("%d\\n",head->data);head=head->next;} } struct list *Inverse(struct list *head){ \/\/用于链表的逆转 struct list *p=NULL,*q;while(head!=NULL){ q=p;p=head;head=head->next;p...
C语言实现线性表的逆置问题,顺序和单链表。在线等高手
逆置有两种方法,第一是把所有节点反过来。还有一种就是改变节点中的值。第一种情况,其实可以考虑用头插法,来实现逆置。下面的算法是基于头插法的思想,逆置链表的,仅供参考。LinkList anti_linklist(LinkList demo){ LInkList *p,*q;\/\/work pointer LinkList head;head=new LinkList();head->...
利用一个顺序栈将单链表逆置是什么意思?不理解逆置跟顺序栈有什么关系...
将链表逆置,例如 原链表:1->2->3->4->5 逆置之后 5->4->3->2->1 使用栈,利用栈“后进先出”的特性。当你把原链表按其 1 2 3 4 5的顺序入栈,再出栈时,顺序即为5 4 3 2 1 形成一个新的链表,达到逆置的目的。
试写一算法,对单链表实现就地逆置。
void reverse(LinkList &L)\/\/单链表的就地逆置{ p=L->next;if(p=NULL|| p->next=NULL)return OK;\/\/空表和表中只有一个结点时,不用逆置。while(p->next!=NULL){ q= p->next;p->next=q->next; \/\/删除结点q,但未释放 q->next=L->next;L->next=q; \/\/将q插入头结点之...
什么叫单链表就地逆置?
1、单链表就地逆置是一种算法。2、如果是顺序存储的话,我们很容易想到解题思路,利用1个辅助变量让第1个元素与第n个元素交换,然后再利用这个辅助变量让第2个元素与第n-1个元素交换,...最后利用这个辅助变量让第n\/2个元素与第n+1-n\/2个元素交换。3、如果不要求“就地”的话,可以创建一个n个...
数据结构问题 C语言解答 线性表的就地逆置
q=q->next;p->next=NULL;while(q){\/\/每次循环将后一个结点变成新链表的第一个结点p=q;q=q->next;p->next=L->next;L->next=p;}}}上面的两个算法我都用完整的C源程序测试过了,没有问题的,希望这个对你有帮助哦,望采纳啊。如果你需要完整的源程序,请在评论里留言吧。
如何用尾插法实现单链表的逆置
p!=NULL){ printf("%d ",p->data);p=p->next;} } main(){ List *head;printf("请输入结点数据,输入0结束\\n");head=create();printf("原链表为:\\n");print(head);printf("\\n");head=nx(head);\/\/尾插法逆序 printf("尾插法逆序后的链表:\\n");print(head);getch();} ...
试写一算法,对单链表实现就地逆置,即利用原表的存储空间将线性表 (a1...
typedef int elementype;define MAXSIZE 100 struct list { elementype *elem;int length;int listsize;};\/\/建立链表 int initlist(list *l){ int i=0,x;l->elem=(elementype *)malloc(sizeof(elementype));if(!l->elem){ cout<<"建立链表失败"<<endl;return 1;} l->length=0;l->...