線性表 資料查重演算法

2021-07-25 08:55:37 字數 2801 閱讀 4062

線性表是計算機最常見的一種資料結構.記錄檔案,陣列,作業系統的程序佇列等都是這種資料結構,它們或者用順序儲存結構,或者用鏈儲存結構.下面介紹都是基於線性表的應用

資料查重是檢視乙個線性表中資料元素或其組成的資料項是否重複儲存為多個結點.所線性表的儲存結構不同,查重演算法也不同;查重的目的不同,演算法也不一樣.就查重而言:清理性查重和統計性查重.

清理性查重:當有」相同」結點儲存時只保留其中乙個(通常是順序表中的第乙個),其餘結點統統摘除

統計性查重:分別統計每乙個節點在表中重複出現的次數

清理性查重的基本思想是:提取表中的乙個結點(將保留在表中),用該結點的結點資料和其他結點進行比較,若有相同者將其從表中刪除掉.這一操作從表中的第乙個結點開始依次進行,直到終點的前繼結點為止.注意:如果有重複結點的話,在對某乙個結點實施查重後表的長度可能縮短.

統計性查重的基本思想與請理性查重基本一致.不同的是,不刪除重複結點,只對重複結點計數.因此,要設定乙個整數陣列記錄每乙個結點在表中的重複次數.

在sequenstruct.c

#include 

#define m 100

typedef

struct sequenlist;

在algorithm.h寫出方法宣告

/*

列印順序表中資料元素

*/void printsequenlist(sequenlist a);

/* 基於順序表的查重演算法:對無序的順序表進行查重,當然也適用於有序的順序表

*/sequenlist chzz(sequenlist a);

在algorithm.c中實現此方法

#include "algorithm.h"

void printsequenlist(sequenlist a)else

}printf("},%d",a.n);

printf("}\n");}/*

資料查重:無序的順序表進行查重

*/sequenlist chzz(sequenlist a)

int i,j,k;

//2.開始迴圈比較資料元素

for(i=0;i//3 第i個元素與後面的每個元素都比較j

j=i+1;

do a的長度自減-1,因為刪除了相等的元素,那麼此時j下表對用的位置是還未比較的元素(也就是沒有刪除前位置的下乙個元素),所以j不用+1

a.n--;

}else

}while (jprintf("資料查重成功\n");

return a;

}

在main.c中的main方法(int main(int argc, const char * argv) {})呼叫此方法,並且進行判斷

#include "algorithm.h"

int main(int argc, const

char * argv) ,10};

printsequenlist(a);

a=chzz(a);

printsequenlist(a);

printf("\n");

}

列印結果:

資料查重-無序

sequen=,10}

資料查重成功

sequen=,8}

注意:

1.在刪除節點的時候,記得刪除重複的結點後,計數器不能+1,因為此時要刪除節點後的結點已經往前移動的乙個位置,所以從當前位置繼續比較即可.

2.刪除節點(重複結點往前移動)的時候,最好用do{}while();迴圈,這樣便於操作迴圈,容易控制計數器的變化.

在algorithm.h寫出方法宣告

#include "sequenstruct.c"

/* 對有序的順序表進行查重

*/sequenlist chzzbyorder(sequenlist a);

在algorithm.c中實現此方法

#include "algorithm.h"

/* 資料查重:對有序的順序表進行查重

*/sequenlist chzzbyorder(sequenlist a)

int i,k;

//2.開始迴圈比較資料元素

do 資料長度-1

a.n--;

//printsequenlist(a);

}else

}while (iprintf("資料查重成功\n");

return a;

}

在main.c中的main方法(int main(int argc, const char * argv) {})呼叫此方法,並且進行判斷

#include "algorithm.h"

int main(int argc, const

char * argv) ,10};

printsequenlist(b);

b=chzzbyorder(b);

printsequenlist(b);

printf("\n");

}

列印結果:

資料查重-有序

sequen=,10}

資料查重成功

sequen=,6}

注意:對有序的順序表進行查重,比無序的順序表查重少乙個迴圈操作(也就是當前節點沒有必要和後面的節點都進行比較,只需要和相鄰後面的節點進行比較即可),當然無序的操作查重也適用於有序的順序表查重.

線性表演算法

1.在乙個遞增的順序表中插入乙個元素,並保持有序.分析 判斷順序表是否滿,滿了則追加空間.從表中的最後乙個元素開始,尋找插入位置,找到則插入,表長增一 int listinsert sq sqlist l,int ele for k l length 1 k 0 l slist k e k l sl...

線性表演算法題庫 線性表習題

鍊錶。若指標p指向某結點時,能夠根據該指標找到其直接後繼,能夠順後繼指標鏈找到p結點後的結點。但是由於不知道其頭指標,所以無法訪問到p指標指向的結點的直接前趨。因此無法刪去該結點。2.雙鏈表。由於這樣的鍊錶提供雙向指標,根據p結點的前趨指標和後繼指標可以查詢到其直接前趨和直接後繼,從而可以刪除該結點...

線性表演算法題庫 資料庫 線性表題庫

p sa s next p 1 p next s b p next s s next p next c s next p next p next s next d s next p next p next s 不帶頭結點的單鏈表 head 為空的判定條件是 a head null b head ne...