算法利用的是链表的头插入法,结果是与插入次序正好颠倒
成都创新互联公司是少有的成都网站建设、做网站、营销型企业网站、小程序开发、手机APP,开发、制作、设计、卖链接、推广优化一站式服务网络公司,从2013年成立,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评
//这是有表头结点链表的逆置
if (head == NULL)//链表为空就退出
return;
struct node *p = head-next, *pnext = NULL;//p是链表当前结点,pnext指向p的后继结点
head-next = NULL;//断开表头结点和后面链表结点的联系
while (p != NULL)
{//如果后面链表中还有结点
pnext = p-next;//pnext暂存当前结点后继结点的指针
p-next = head-next;//将后面链表的第一个结点插入在前面链表的头部
head-next = p;
p = pnext;// p重新指向后面链表的第一结点
}
用数据结构中的单链表求逆置的编程:
#include"iostream"
using
namespace
std;
struct
node{
int
data;
node
*next;
};
node
*p=NULL;
void
ins(int
x)
//将输入的数采用头插法放入链表中
{
node
*q=new
node;
q-data=x;
q-next=p;
p=q;
}
void
rev(int
i)
//将链表逆置并输出
{
node
*m;
//因为用了头插法放入数据所以输出的应与输入的相同
int
x;
m=p;
p=NULL;
int
j;
while(m!=NULL)
{
node
*n=m-next;
m-next=p;
p=m;
m=n;
}
cout"逆置链表后的结果:";
for(j=0;ji;j++)
{
x=p-data;
coutx;
p=p-next;
}
}
void
main()
{
int
i;
int
a[4];
cout"please
inpute
data(4个数):\n";
for(i=0;i4;i++)
cina[i];
for(i=0;i4;i++)
ins(a[i]);
rev(i);
}
错误原因:
1)题目要求“建立长度为n的顺序表”,这个是要动态申请内存的,不能使用预先定大小的char data[100];代替,因为加入元素个数大于100,这个大小已知的数组就会越界,这是错误一。
2)您代码中输入的变量m是顺序表长度,而却要输入2*m的字符,虽然后面只放入了m个字符给a数组,但是与题目要求不符合,这是错误二。
附加:程序代码不精简,不需要用链表申请释放内存之类的,造成不少冗余代码,这个不算是错误问题。
1)初始化指针p和q,分别指向链表中相邻的两个元素;
2)当p-next不为空时,做如下处理:
①若相邻两元素不相等时,p和q都向后推一步;
②否则,当相邻元素相等时,删除多余元素。
【算法源代码】
void Delete_Equal(LinkList *L)
{ p=(*L)-next;q=p-next; /*p和q指向相邻的两个元素*/
while(p-next)
{ if(p-data!=q-data) /*若相邻两元素不相等时,p和q都向后推一步*/
{ p=p-next; q=p-next; }
else
{ while(q-data==p-data) /*当相邻元素相等时删除多余元素*/
{ r=q;
q=q-next;
free(r);
}
p-next=q;p=q;q=p-next;
}/*else*/
}/*while*/
}/*Delete_Equal */
试设计一个算法,对带头结点的单链表实现就地逆置。
【算法分析】
1)空表或长度为1的表,不做任何处理;
2)表长大于2时,做如下处理:
①首先将整个链表一分为二,即从链表的第一元素结点处断开;
②逐个地把剩余链表的当前元素q插入到链表的头部。
【算法源代码】
void LinkList_reverse(LinkList L)
{ if(!L-next||!L-next-next) return;
p=L-next; q=p-next; s=q-next; p-next=NULL; /*从链表的第一元素结点处断开*/
while(s-next)
{q-next=p;p=q;
q=s;s=s-next; /*把L的元素逐个插入新表表头*/
}
q-next=p;s-next=q;L-next=s;
}/*LinkList_reverse*/
请问你的队列和栈数据结构实现了没?如果实现了就只看main方法吧
//MyStack.java
import java.util.LinkedList;
public class MyStack {
LinkedList linkList = new LinkedListObject();
public void push(Object object) {
linkList.addFirst(object);
}
public boolean isEmpty() {
return linkList.isEmpty();
}
public Object pop() {
if (!linkList.isEmpty())
return linkList.removeFirst();
return "栈内无元素";
}
}
//MyQueue.java
public class MyQueue {
LinkedList linkedList = new LinkedList();
public void put(Object o){
linkedList.addLast(o);
}
public Object get(){
if(!linkedList.isEmpty())
return linkedList.removeFirst();
return "";
}
public boolean isEmpty(){
return linkedList.isEmpty();
}
}
//test.java
public class test{
public static void main(String[] args) {
MyStack ms = new MyStack();
MyQueue mq = new MyQueue();
mq.put(1);
mq.put(2);
mq.put(3);
while(!mq.isEmpty()){
ms.push(mq.get());
}
while(!ms.isEmpty()){
mq.put(ms.pop());
}
while(!mq.isEmpty()){
System.out.print(mq.get());
}
}
}
程序输入是1 2 3,输出是3 2 1
本文名称:数据结构java逆置代码 数据结构java逆置代码是什么
转载注明:https://www.cdcxhl.com/article20/dossijo.html
成都网站建设公司_创新互联,为您提供、App开发、网站制作、标签优化、企业建站、网站营销
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联