1. 程式人生 > >第二次作業--線性表

第二次作業--線性表

scanf 如何 bin 描述 分享圖片 發現 else str scan

一、PTA實驗作業

本周要求挑3道題目寫設計思路、調試過程。設計思路用偽代碼描述。題目選做要求:

  • 順序表選擇一題(6-2,6-3,7-1選一題),代碼必須用順序結構抽象數據類型封裝
  • 單鏈表選擇一題(6-1不能選)
  • 有序表選擇一題

題目:

6-3 jmu-ds- 順序表刪除重復元素(25 分)

設計一個算法,從順序表中刪除重復的元素,並使剩余元素間的相對次序保存不變

設計思路:

int i=0,j=0,k; 先定義三個計數下標
for(i=0;i<L->length;i++){
j=i+1; 讓j始終比i大1,才能讓兩個相鄰的數比較
while(j<L->length){
if(L->data[i]==L->data[j]){ 判斷相鄰兩個數是否相等
for(k=j;k<L->length-1;k++){
L->data[k]=L->data[k+1]; 如果相等讓下標為J的數等與j+1然後在與下標為i的數相比

}
L->length--; 如果有相等的就表長減一
}
else
j++;
}
}

代碼截圖:

技術分享圖片

PTA測試結果技術分享圖片

6-3 jmu-ds-鏈表倒數第m個數(20 分)

已知一個帶有表頭節點的單鏈表,查找鏈表中倒數第m個位置上的節點

設計思路:

int Find(LinkList L, int m )
{
LinkList p;
p=L; 定義一個Linklist類型的P鏈表指針 讓P等於L
int i=0,a;定義兩個計數的
while(L!=NULL){
L=L->next; 計算L 的表長
i++;
}
if(i-m>0){ 判斷m的位置是否有效
for(a=0;a<i-m;a++){   i-m表示倒數第m個
p=p->next;
}
if(p!=NULL){    判斷m位置是否有效
return p->data;   返回倒數第m個的值
}
else
return -1;
}
else
return -1;
}

代碼截圖:技術分享圖片

PTA測試結果技術分享圖片

錯誤原因:因為一開始只判斷了i-m是否大於0即m位置是否有效,並沒有判斷P是否等於NULL所以只有部分正確,後面編譯錯誤是少了符號;

7-1 兩個有序鏈表序列的合並(20 分)

已知兩個非降序鏈表序列S1與S2,設計函數構造出S1與S2的並集新非降序鏈表S3。

設計思路:

#include<stdio.h>
#include<stdlib.h>

typedef struct Node* List;
struct Node
{
int data;
struct Node *next;
};

List IniList();
void In(List L);
void Out(List L);
void combine(List L1,List L2,List L3);

int main()
{
List L1,L2,L3;
L1=IniList(); 構建L1,L2,L3鏈表
L2=IniList();
L3=IniList();
In(L1);In(L2); 輸入L1,L2序列
combine(L1,L2,L3); 比較L1,L2的值然後用尾插法 插入到L3中;
Out(L3); 輸出L3;
return 0;
}

List IniList()
{ 初始化鏈表
List L;
L=(List)malloc(sizeof(struct Node));
if(!L) return NULL;
L->next=NULL;
return L;
}

void In(List L)
{
List p; 定義個List類型的P鏈表指針
int a; 定義一個a用於輸入鏈表的值
scanf("%d",&a);
while(a!=-1) 根據題目意思當a=-1時停止輸入;
{
p=(List)malloc(sizeof(struct Node));
if(!p) return; 初始化鏈表p
p->data=a; p的數據等於a
p->next=NULL; p的下一個節點等於空

L->next=p; 用尾插法讓L頭指針的下一個節點等於p

L=p; L數據等於p的數據。

scanf("%d",&a);
}
}
void Out(List L)
{
L=L->next; 讓L等於頭節點的下一個節點,從而進行輸出鏈表L中數值
if(L==NULL)
{
printf("NULL");    如果L等於NULL則輸出NULL;
return;
}
printf("%d",L->data);
L=L->next; 輸出L的數據後讓L等於下一個節點的數據繼續輸出。
while(L)
{
printf(" %d",L->data);
L=L->next;
}
}
void combine(List L1,List L2,List L3) 比較L1,L2表中的數值。
{
L1=L1->next; 讓L1,L2都等於各自頭節點的下一節點
L2=L2->next;
while(L1!=NULL&&L2!=NULL) 當L1或L2中有一個等於NULL就結束循環
{
if(L1->data>L2->data) 判斷L1的數據是否大於L2,
{
L3->next=L2; 如果大於L2的數據則用尾插法把L2的值插在L3中
L2=L2->next;
}
else
{
L3->next=L1; 否則就把L1的值插在L3中
L1=L1->next;
}
L3=L3->next;
}
if(L1==NULL&&L2==NULL) return;
if(L1!=NULL)
L3->next=L1; 如果L1,L2中有一個等於NULL 後跳出循環後,另一個鏈表中還有未插入的數據直接插在L3的後面
else L3->next=L2;
}

代碼截圖技術分享圖片技術分享圖片技術分享圖片技術分享圖片

PTA測試結果技術分享圖片

錯誤分析:首先編譯錯誤是因為定義結構體時忘記添加*List 倒置第一個函數的List 未知,後面部分正確是因為格式原因 最後一個不能有空格。

二、截圖本周題目集的PTA最後排名

1、順序表PTA排名技術分享圖片

技術分享圖片

PTA總分201。

三、本周學習總結

1、談談你本周數據結構學習時間是如何安排,對自己安排滿意麽,若不滿意,打算做什麽改變?

本周數據結構時間安排的較短,安排在了周五晚上和周六白天, 經歷果這次之後發現以後一定要把時間多拍一點,才不會非常趕搞得非常累。

2、談談你對線性表的認識

線性表是最基本、最簡單、也是最常用的一種數據結構。線性表中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其它數據元素都是首尾相接的。

第二次作業--線性表