算法利用的是鏈表的頭插入法,結(jié)果是與插入次序正好顛倒
成都創(chuàng)新互聯(lián)公司是少有的成都網(wǎng)站建設(shè)、做網(wǎng)站、營(yíng)銷型企業(yè)網(wǎng)站、小程序開發(fā)、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年成立,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營(yíng)理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評(píng)
//這是有表頭結(jié)點(diǎn)鏈表的逆置
if (head == NULL)//鏈表為空就退出
return;
struct node *p = head-next, *pnext = NULL;//p是鏈表當(dāng)前結(jié)點(diǎn),pnext指向p的后繼結(jié)點(diǎn)
head-next = NULL;//斷開表頭結(jié)點(diǎn)和后面鏈表結(jié)點(diǎn)的聯(lián)系
while (p != NULL)
{//如果后面鏈表中還有結(jié)點(diǎn)
pnext = p-next;//pnext暫存當(dāng)前結(jié)點(diǎn)后繼結(jié)點(diǎn)的指針
p-next = head-next;//將后面鏈表的第一個(gè)結(jié)點(diǎn)插入在前面鏈表的頭部
head-next = p;
p = pnext;// p重新指向后面鏈表的第一結(jié)點(diǎn)
}
用數(shù)據(jù)結(jié)構(gòu)中的單鏈表求逆置的編程:
#include"iostream"
using
namespace
std;
struct
node{
int
data;
node
*next;
};
node
*p=NULL;
void
ins(int
x)
//將輸入的數(shù)采用頭插法放入鏈表中
{
node
*q=new
node;
q-data=x;
q-next=p;
p=q;
}
void
rev(int
i)
//將鏈表逆置并輸出
{
node
*m;
//因?yàn)橛昧祟^插法放入數(shù)據(jù)所以輸出的應(yīng)與輸入的相同
int
x;
m=p;
p=NULL;
int
j;
while(m!=NULL)
{
node
*n=m-next;
m-next=p;
p=m;
m=n;
}
cout"逆置鏈表后的結(jié)果:";
for(j=0;ji;j++)
{
x=p-data;
coutx;
p=p-next;
}
}
void
main()
{
int
i;
int
a[4];
cout"please
inpute
data(4個(gè)數(shù)):\n";
for(i=0;i4;i++)
cina[i];
for(i=0;i4;i++)
ins(a[i]);
rev(i);
}
錯(cuò)誤原因:
1)題目要求“建立長(zhǎng)度為n的順序表”,這個(gè)是要?jiǎng)討B(tài)申請(qǐng)內(nèi)存的,不能使用預(yù)先定大小的char data[100];代替,因?yàn)榧尤朐貍€(gè)數(shù)大于100,這個(gè)大小已知的數(shù)組就會(huì)越界,這是錯(cuò)誤一。
2)您代碼中輸入的變量m是順序表長(zhǎng)度,而卻要輸入2*m的字符,雖然后面只放入了m個(gè)字符給a數(shù)組,但是與題目要求不符合,這是錯(cuò)誤二。
附加:程序代碼不精簡(jiǎn),不需要用鏈表申請(qǐng)釋放內(nèi)存之類的,造成不少冗余代碼,這個(gè)不算是錯(cuò)誤問題。
1)初始化指針p和q,分別指向鏈表中相鄰的兩個(gè)元素;
2)當(dāng)p-next不為空時(shí),做如下處理:
①若相鄰兩元素不相等時(shí),p和q都向后推一步;
②否則,當(dāng)相鄰元素相等時(shí),刪除多余元素。
【算法源代碼】
void Delete_Equal(LinkList *L)
{ p=(*L)-next;q=p-next; /*p和q指向相鄰的兩個(gè)元素*/
while(p-next)
{ if(p-data!=q-data) /*若相鄰兩元素不相等時(shí),p和q都向后推一步*/
{ p=p-next; q=p-next; }
else
{ while(q-data==p-data) /*當(dāng)相鄰元素相等時(shí)刪除多余元素*/
{ r=q;
q=q-next;
free(r);
}
p-next=q;p=q;q=p-next;
}/*else*/
}/*while*/
}/*Delete_Equal */
試設(shè)計(jì)一個(gè)算法,對(duì)帶頭結(jié)點(diǎn)的單鏈表實(shí)現(xiàn)就地逆置。
【算法分析】
1)空表或長(zhǎng)度為1的表,不做任何處理;
2)表長(zhǎng)大于2時(shí),做如下處理:
①首先將整個(gè)鏈表一分為二,即從鏈表的第一元素結(jié)點(diǎn)處斷開;
②逐個(gè)地把剩余鏈表的當(dāng)前元素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; /*從鏈表的第一元素結(jié)點(diǎn)處斷開*/
while(s-next)
{q-next=p;p=q;
q=s;s=s-next; /*把L的元素逐個(gè)插入新表表頭*/
}
q-next=p;s-next=q;L-next=s;
}/*LinkList_reverse*/
請(qǐng)問你的隊(duì)列和棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)了沒?如果實(shí)現(xiàn)了就只看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 "棧內(nèi)無元素";
}
}
//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
本文名稱:數(shù)據(jù)結(jié)構(gòu)java逆置代碼 數(shù)據(jù)結(jié)構(gòu)java逆置代碼是什么
轉(zhuǎn)載注明:http://jinyejixie.com/article20/dossijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、App開發(fā)、網(wǎng)站制作、標(biāo)簽優(yōu)化、企業(yè)建站、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)