部落格作業2 線性表

2022-05-31 02:42:07 字數 4099 閱讀 8450

1.建表函式createsqlist:

定義建表函式createsqlist(list &l,int a,int n)

為l分配空間

for int i=0 to n-1

把陣列a的資料分別賦給l->data[i]

l->length=n;

2.輸出函式dispsqlist

定義輸出函式dispsqlist(list l)

定義count為0

for int i=0 to l->length-1

如果count=0

輸出l->data[i],count++

否則輸出空格加l->data[i]

3.刪除函式delsamenode

定義刪除delsamenode(list &l)

定義i,j=0;

定義陣列a[100],b[maxsize],left[maxsize];

初始化陣列a,b為0

for i=0 to l->length-1

a[l->data[i]]++;

for i=0 to l->length-1

如果a[l->data[i]]>1&&b[l->data[i]]!=0

a[l->data[i]]--;直接進行下一次迴圈

left[j]=l->data[i];

j++;

b[l->data[i]]++;

for i=0 to j-1

l->data[i]=left[i];

l->length長度賦值為j

第一次提交時答案錯誤,經除錯後發現,陣列沒有初始化導致答案錯誤,於是就寫了個初始化的**,提交後格式錯誤,想起我沒有控制末尾無空格,改了之後答案正確。

1.建鍊錶函式createsqlist:

定義函式createlist(list &l,int n)

為l分配空間,l->next置空

定義list型變數p,tail

定義int型變數i

tail=l;

for i=0 to n-1

為p分配空間

輸入p->data

tail->next=p;

tail=p;

p->next=null;//尾插法連線

2.列印鍊錶函式printlist

定義函式printlist(list l)

定義flag=0

如果l為空

輸出null

while(l)

如果flag為0

輸出l->data,flag++

否則輸出空格加l->data

l=l->next

3.逆置鍊錶函式reverselist

定義函式reverselist(list &l)

定義list型變數newhead=null,tail=null,p;

p=l->next

while(p)

tail=p->next;

p->next=newhead;

newhead=p;

p=tail;//逆置鍊錶,頭指標為newhead

newhead賦值給l

提交後發現鍊錶不空時格式錯誤,檢查**時發現沒有控制末尾無空格。

鍊錶結點定義:

typedef struct lnode

linklist,*list;

1.建鍊錶函式createlistr:

定義函式createlistr(list &l,int n)

為l分配空間,l->next置空

定義list型變數p,tail

定義int型變數i

tail=l;

for i=0 to n-1

為p分配空間

輸入p->data

tail->next=p;

tail=p;

p->next=null;//尾插法連線

2.列印函式displist

定義函式displist(list l,int n)

定義整型變數i

for i=1 to n

l=l->next

輸出l->data

3.求並集函式union

定義函式union(list s1,list s2,list &s3)

定義list型變數p,tail

為s3分配空間

tail=s3;

while(s1&&s2)//二路歸併求並集

如果s1->datadata

把s1->data連線進s3鍊錶中

否則把s2->data連線進s3鍊錶中

判斷s1,s2哪個還未遍歷完

未遍歷完的把餘下的數值都連線進s3鍊錶中

提交時部分正確,檢查**並除錯,輸入不同的例子去檢查,發現有些例子會出現錯誤,後來發現輸出函式的迴圈條件出現錯誤,是我看錯了題目的意思,改過來就正確了。

對於學習時間的安排我並沒有很明確的計畫,當有新的課堂派發布需要去預習的時候我就會去預習課本,每上完一節課後對於一些沒弄懂的知識,繼續去學習,爭取早一點把不懂的知識點解決。對於程式設計時間的安排,就是當有pta發布時,有空閒的時間我就會去做。對於自己的安排,我感覺還好。

選首領。n個遊戲者圍成一圈,從第乙個開始順序報數1,2,3.凡報到3者退出圈子,最後留在圈中的人為首領。

#include #include typedef struct nodenode,*linklist;  

linklist create_list(int n)

/* 建立乙個節點數為n的單迴圈鍊錶,返回值為遊戲編號為1的節點的指標 */

head->code=1; head->next=head;

for(i=n;i>1;--i)

p->code=i; p->next=head->next; head->next=p;

}/*for*/

return head;

}/*create_list*/

void output(linklist head)/*輸出鍊錶中的節點的資料*/

while(p!=head);

printf("/n");

}/*output*/

void play(linklist head,int n)

/*if*/

else

}/*while*/

printf("/n%4d 是首領.",p->code); /*輸出最後留在圈子內的人的編號*/

}/*play*/

void main(void)

}

這個題目在上個學期也有做過,那就是猴子選大王那一道題目,以前是用陣列做的,現在這個程式是用鍊錶做的,感覺挺巧妙的,方法是建立乙個包含n個節點的單迴圈鍊錶來模擬n個人圍成的圈。節點的資料域存放遊戲者的編號。

在程式中,以刪除節點模擬人退出圈子的處理,整型變數c(初始值為1)用於計數,指標變數p的初始值為head,執行時,從p所指的節點開始計數,p沿煉表中的指標每次向後指乙個節點,c值隨p指標的移動相應地遞增。當c計數到2時,就刪除下乙個節點,然後將c置為0。為了避免將剩下的最後乙個節點刪除,另外設定乙個計數器k,其初值為參加遊戲的人數。每當刪除乙個節點時,k值就減1,當k等於1時,首領就選出來了。

部落格作業2 線性表

定義變數n存放順序表長度,i,j 0控制迴圈,l 1存放子列長度,k,m,max存放最大子列長度,flag存放最長子列陣列下標,sum 0求和 scanf d n int a n 存放母列 b 100000 存放子列長度 for i 0 to n 輸入母列 end for for i 1 to n ...

部落格作業2 線性表

定義整型變數i作為迴圈變數,j用來儲存所刪除節點的個數 for i小於順序表長度時執行迴圈 if 順序表中第i個數大於mind且小於maxd j 否則l data i j l data i 本題第一次提交時用了while迴圈語句,結果編譯器判定是段錯誤,後來改為for迴圈時提交答案正確。void c...

部落格作業2 線性表

for i 0 to length 1 if j大於等於i length為k 剛開始把重新賦值的 放在了第二個for裡面。linklist p l 用p代替l while p next不為0 if m為0或者大於n 不存在返回 1 while j小於n m 1且p不為0 if p為0 返回 1 否則...