#include
#include
#include
#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
#define overflow -2
#define maxbooknum 1000 //假設只對1000本書建立索引表(1000)
#define maxkeynum 2500 //索引表的最大容量(2500)
#define maxlinelen 500 //書目串的最大長度(500)
#define maxwordnum 10 //詞表的最大容量
#define maxwordlength 30 //單詞的最大長度
typedef
int status;
typedef
int elemtype; //定義鍊錶的資料元素型別為整型
typedef
int boolean;
typedef
struct
wordlisttype; //詞表的型別(順序表)
typedef
struct
hstring;
typedef
struct lnode
lnode,*link,*position;
typedef
struct
linklist;
typedef
struct
idxtermtype; //索引項型別
typedef
struct
idxlisttype; //索引表型別
//----------------主要變數--------------
char buf[maxlinelen]; //書目串緩衝區
wordlisttype wdlist; //關鍵字詞表
idxlisttype idxlist; //索引表
char oftenwords[6][10] = ;
/*******************************宣告部分****************************************/
//--------------基本操作---------
void initidxlist (idxlisttype *idxlist);
//初始化操作,置索引表idxlist為空表,且在idxlist.item[0]設一空串
void getline (file *f);
//從檔案f讀入乙個書目資訊到書目串緩衝區buf
void extractkeyword (int *num);
//status extractkeyword(char* buffer,wordlisttype *w,int *num);
status insidxlist (idxlisttype *idxlist,elemtype bno);
void puttext (file *g,idxlisttype idxlist);
//將生成的索引表idxlist輸出到檔案g
//--------------為實現在索引表上進行插入,要先實現下列操作-----------
void getword (int i,hstring *wd);
int locate (idxlisttype *idxlist,hstring wd,boolean *b);
//中的位置,且b取值true;否則返回插入位置,且b取值false
void insertnewkey(int j,hstring wd);
status insertbook (int i,int bno);
//在索引表idxlist的第i項中插入書號為bno的索引
//------------串的堆分配儲存表示-----------
status strassign(hstring *t,char *chars);
//生成乙個其值等於串常量chars的串t
int strcompare(hstring s,hstring t);
//若s>t,則返回值》0,若s=t,則返回值 = 0,若sstatus strcopy(hstring *t, hstring s);
//由串s複製得串t
//----------------帶頭結點的線性鍊錶-------------
status initlist(linklist *l);
//構造乙個空的線性鍊錶l
status makenode(link *p,elemtype e);
//分配由p指向值e的結點,並返回ok;若分配失敗,則返回error
//之後,改變鍊錶l的尾指標指向新的尾結點
/*******************************函式部分****************************************/
status strassign(hstring *t,char *chars)
else //else
return ok;
}void initstring(hstring *t)
int strcompare(hstring s,hstring t)
return s.length-t.length;
}status strcopy(hstring *t, hstring s)
status initlist(linklist *l)
status makenode(link *p,elemtype e)
(*l).tail = s;
(*l).len += i;
return ok;
}void getword(int i,hstring *wd)
int locate(idxlisttype *idxlist,hstring wd,boolean *b)
else
}void insertnewkey(int j,hstring wd)
initstring(&idxlist.item[j].key);
strcopy(&idxlist.item[j].key,wd); //插入新的索引項 //串賦值
initlist(&idxlist.item[j].bnolist); //初始化書號索引表為空表
++idxlist.last;
}status insertbook (int i,int bookno)
status insertidxlist(idxlisttype *idxlist,int bno)
return ok;
}void initidxlist (idxlisttype *idxlist)
}void extractkeyword (int *booknum)
tempchar[i] = '\0';
*booknum = atoi(tempchar); //將書號轉為int
for(m = 0;m<=i;m++)
tempchar[m] = '\0'; //清空tempchat
i++; //推進一位,當前*(buf+i)開始為書名
while(*(buf+i) != '\n' && *(buf+i) != '\0')
tempchar[j] = *(buf+i); //把當前字元加入tempchar中//------------
j++;
i++;
} //if
else//if
}//for
if(ignore)//if
else//else
}//else
}//while
}void getline(file *f)
void puttext (file *g,idxlisttype idxlist)
//for
putc('\n',g);
}//for
}void printfile(file *filename)
printf("\n");
rewind(filename);
}/*******************************主函式部分**************************************/
int main()
if((g = fopen("keywordindex_self.txt","w"))==null)
printf("書單檔案:\n");
printfile(f);
initidxlist(&idxlist);
wordlisttype w;
while(!feof(f))
puttext(g,idxlist);
fclose(f);
fclose(g);
printf("\n結果如下:\n");
資料結構 資料結構演算法
分治法 對於乙個規模為n的問題,若該問題可以容易地解決 比如說規模n較小 則直接解決 否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。動態規劃法 這種演算法也用到了分治思想,它的做法是將問題例項分解為更小的 相似的子...
資料結構與演算法(三) 變位詞判斷問題
解法2 排序比較 解法3 暴力法 解法4 計數比較 小甲魚老師的資料結構與演算法是以c為基礎的,統計出身,沒有學過c,就換了其他的課來聽啦。現在聽的是mooc上北大的課,以python為基礎的。變位詞是指兩個詞之間存在組成字母重新排列關係,如heart和earth,python和typhon。為了簡...
資料結構與演算法之美01 開篇詞
作者是王爭,畢業於西安交通大學計算機專業。現在回想起來,本科畢業的時候,我的程式設計水平其實是很差的。直到讀研究生的時候,乙個師兄給了我一本 演算法導論 說你可以看看,對你的程式設計會很有幫助。沒想到,從此我對演算法的 迷戀 便一發不可收拾。之後,我如飢似渴地把圖書館裡幾乎所有資料結構和演算法書籍都...