c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)
題目
給定一個常數(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
注意陷阱:輸入可能存在非鏈表內數(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好的地方在于空間換時間,雖然開辟內存比較大, 但是省卻第一次遍歷排序鏈表,同時利用排好序的鏈表節(jié)點關系,直接忽略掉結構體中的next元素,將鏈表反轉即可輸出相關地址。
總結
以上是生活随笔為你收集整理的c语言 错误 无效的控制谓词,PAT 1025反转链表的代码实现及错误分析(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投票选举c语言程序,C语言元旦礼物:经典
- 下一篇: c语言如何获取按键,c语言获得键盘的按键