日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)

發(fā)布時間:2024/4/13 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

給定一個常數(shù)K以及一個單鏈表L,請編寫程序將L中每K個結點反轉。例如:給定L為1→2→3→4→5→6,K為3,則輸出應該為3→2→1→6→5→4;如果K為4,則輸出應該為4→3→2→1→5→6,即最后不到K個元素不反轉。

輸入格式:

每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的地址、結點總個數(shù)正整數(shù)N(<= 10^5^)、以及正整數(shù)K(<=N),即要求反轉的子鏈結點的個數(shù)。結點的地址是5位非負整數(shù),NULL地址用-1表示。

接下來有N行,每行格式為:

Address Data Next

其中Address是結點地址,Data是該結點保存的整數(shù)數(shù)據(jù),Next是下一結點的地址。

輸出格式:

對每個測試用例,順序輸出反轉后的鏈表,其上每個結點占一行,格式與輸入相同。

輸入樣例:

00100 6 4

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

輸出樣例:

00000 4 33218

33218 3 12309

12309 2 00100

00100 1 99999

99999 5 68237

68237 6 -1

注意陷阱:輸入可能存在非鏈表內(nèi)數(shù)據(jù),需要剔除,最后一定是NULL

實現(xiàn)思路1:

1.定義結構體,包含3個整數(shù)(5位地址最后可加0輸出),定義兩個指定大小結構體數(shù)組link1和link2;

2.將數(shù)據(jù)存入數(shù)組link1,利用下個地址變量next將鏈表按順序存入link2,同時計算數(shù)量也剔除了無效數(shù)據(jù);

3.判斷總數(shù)和塊大小的關系,將反轉之后的鏈表存入link1;

4.輸出

代碼如下:

#include//定義結構體

typedef struct{

int iAddr;

int iData;

int iNext;

} LINK;

int main()

{

int next=0,iL=0,iK=0;

scanf("%d%d%d",&next,&iL,&iK);

LINK link1[iL+1],link2[iL+1];

int iCnt=0;

//存入數(shù)據(jù)到link1

for(int i=0;i0;i--)

{

for(int j=0;j0;i--)

{

for(int j=0;j

實現(xiàn)思路2:考慮地址是五位數(shù),可建立大小為100000的數(shù)組,在第一遍存數(shù)據(jù)的時候,就把地址作為下標存入這個數(shù)組中。一切輸入都存儲完畢后,根據(jù)初始地址,一個一個在地址數(shù)組中查找對應的值(數(shù)組按下標查找比數(shù)組循環(huán)遍歷效率高太多),并將其存入結構體數(shù)組中(結構體有三個變量:address,data,next),最后使用思路1翻轉,輸出結構體數(shù)組。

代碼如下:

#includestruct node

{

int add,data,next;

}a[100010],b[100010],c[100010];//a按地址下標存放輸入數(shù)據(jù),b依次存放順序鏈表,c

int main()

{

int beginadd=0,n=0,k=0;

int i=0,j=0,index=0;

scanf("%d%d%d",&beginadd,&n,&k);

//按地址下標存放輸入數(shù)據(jù)

for(i = 0;i < n;i++)

{

scanf("%d",&index);

scanf("%d %d",&a[index].data,&a[index].next);

}

//依次存放順序鏈表

int num=0

for(i = beginadd;i != -1;i = a[i].next)

{

b[num].add = i;

b[num].data = a[i].data;

b[num].next = a[i].next;

num++;

}

int s=num/k,y= num%k;//s為反轉塊數(shù)量,y為不反轉鏈表節(jié)點數(shù)量

//按需反轉,無需考慮next地址,因為順序正確,next地址就是下一個節(jié)點的add

int pos = 0;

for(i = 1;i <= s;i++)

{

for(j = i*k-1;j >= (i-1)*k;j--)

{

c[pos].add = b[j].add;

c[pos].data = b[j].data;

pos++;

}

}

if(y != 0)

{

for(i = s*k;i < num;i++)

{

c[pos].add = b[i].add;

c[pos].data = b[i].data;

pos++;

}

}

for(int k= 0; k < pos - 1; k++) {

printf("%05d %d %05d\n", c[k].add, c[k].data, c[k+1].add);

}

printf("%05d %d -1\n", c[pos-1].add, c[pos-1].data);

return 0;

}

錯誤分析:在一開始的思考中,如果把地址作為字符數(shù)組,則難度飆升,思路1的實現(xiàn)中,有測試點顯示運行超時,思路2比思路1好的地方在于空間換時間,雖然開辟內(nèi)存比較大, 但是省卻第一次遍歷排序鏈表,同時利用排好序的鏈表節(jié)點關系,直接忽略掉結構體中的next元素,將鏈表反轉即可輸出相關地址。

總結

以上是生活随笔為你收集整理的c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。