SCAU 8581 線性鍊錶逆置

2021-10-24 02:41:13 字數 3255 閱讀 4162

description

線性鍊錶的基本操作如下:

#include

#include

#define error 0

#define ok 1

#define elemtype int

typedef int status;

typedef struct lnode

lnode,*linklist;

status listinsert_l(linklist &l, int i, elemtype e)

if (!p || j > i-1) return error; // i小於1或者大於表長

s = (linklist)malloc(sizeof(lnode)); // 生成新結點

s->data = e; s->next = p->next; // 插入l中

p->next = s;

return ok;

} // linstinsert_l

status listdelete_l(linklist &l, int i, elemtype &e)

if (!(p->next) || j > i-1) return error; // 刪除位置不合理

q = p->next;

p->next = q->next; // 刪除並釋放結點

e = q->data;

free(q);

return ok;

} // listdelete_l

設有一線性表a=(a0,a1,…, ai,…an-1),其逆線性表定義為a』=( an-1,…, ai,…,a1, a0),設計乙個演算法,將線性表逆置,要求線性表仍占用原線性表的空間。

輸入格式

第一行:輸入n,表示單鏈表的元素個數

第二行:輸入單鏈表的各元素,用空格分開

輸出格式

第一行:輸出單鏈表逆置前的元素列表

第二行:輸出單鏈表逆置後的元素列表

輸入樣例

832 97 54 65 35 84 61 75

輸出樣例

the list is:32 97 54 65 35 84 61 75

the turned list is:75 61 84 35 65 54 97 32

解題思路:(逆置操作)

解法1:

1.如果l==null ,返回null

2.如果l!=null(以4結點的鍊錶為例)

只要把cur後的結點乙個個往前移即可

**如下:

#include

#include

#define error 0

#define ok 1

#define elemtype int

typedef

int status;

typedef

struct lnode

lnode,

*linklist;

status listinsert_l

(linklist &l,

int i, elemtype e)if(

!p || j > i-1)

return error;

// i小於1或者大於表長

s =(linklist)

malloc

(sizeof

(lnode));

// 生成新結點

s->data = e; s-

>next = p-

>next;

// 插入l中

p->next = s;

return ok;

}// linstinsert_l

status listdelete_l

(linklist &l,

int i, elemtype &e)if(

!(p-

>next)

|| j > i-1)

return error;

// 刪除位置不合理

q = p-

>next;

p->next = q-

>next;

// 刪除並釋放結點

e = q-

>data;

free

(q);

return ok;

}// listdelete_l

intinitlist

(linklist &l)

//初始化

linklist listreverse

(linklist &l)

//鍊錶逆置

return l;

}void

print

(linklist l)

printf

("\n");

}int

main()

printf

("the list is:");

print

(l);

listreverse

(l);

printf

("the turned list is:");

print

(l);

return0;

}

解法2:直接用stl中的list模板(感覺有點多餘,哈哈)

**如下:

#include

#include

using

namespace std;

void

print

(const list<

int> a)

;int

main()

cout<<

"the list is:"

;print

(a);

a.reverse()

;//逆置

cout<<

"the turned list is:"

;print

(a);

return0;

}

鍊錶就地逆置

就地逆置,就是在不借助任何中間變數的情況下,逆置一單鏈表。演算法思路 逆置後的點鍊錶初始為空,表中的節點不是新生成的,而是從原鍊錶當中一次 刪除 再逐個頭插到逆置表中。設逆置鍊錶的初始態為空表,刪除 已知鍊錶中 的第乙個節點,然後將它 插入 到逆置鍊錶的 表頭 即使得他成為逆置鍊錶中 新 的第乙個節...

鍊錶的逆置

5.鍊錶的逆置 已知head指向乙個帶頭節點的單向鍊錶,鍊錶中每個結點包含資料域和指標域。用鍊錶實現該鍊錶的逆置,並輸出。例如 輸入 5 整數表示要輸入的字元個數 abcde 輸出 edcba 注意 不允許通過改變每個節點的資料域來實現效果,必須改變鍊錶連線順序發生逆置。我寫的 如下 include...

鍊錶的逆置

剛剛除錯出來,趁熱寫一下。輸入多個整數,以 1作為結束標誌,順序建立乙個帶頭結點的單鏈表,之後對該單鏈表的資料進行逆置,並輸出逆置後的單鏈表資料。input 輸入多個整數,以 1作為結束標誌。output 輸出逆置後的單鏈表資料。sample input 12 56 4 6 55 15 33 62 ...