版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本文實例為大家分享了C語言實現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表的具體代碼,供大家參考,具體內(nèi)容如下
忽然想起來,大概在兩年之前學(xué)習(xí)C語言的時候,曾經(jīng)用C語言寫過一些通用的數(shù)據(jù)結(jié)構(gòu)。主要也
就實現(xiàn)了鏈表、隊列、椎、HashSet,還有HashMap。當(dāng)時只是知道標準的C語言中沒有這方面的
類庫,后來才知道有很多第三方的類似這樣的類庫。廢話不多說,先把代碼粘過來。
下面實現(xiàn)的是通用鏈表,注意鏈表中只存儲了指針,沒有儲存實際的數(shù)據(jù)。
頭文件
***FilemyList.h
**************************I
#ifndefMYLIST_H_INCLUDED
#defineMYLIST_H_INCLUDED
#include<stdio.h>
typedefstructmyNode
{
void*data;
structmyNode*next;
}MyNode;
typedefstructmyList
{
MyNode*first;
MyNode*last;
intcount;
int(*equal)(void*a,void*b);
}MyList;
typedefstructmyListlterator
{
MyNode*p;
intcount;
intallSize;
}MyListlterator;
〃創(chuàng)建鏈表
MyList*createMyList();
〃創(chuàng)建鏈表,帶有相等參數(shù),用于查找
MyList*createMySearchList(int(*equal)(void*a,void*b));
〃釋放鏈表
voidfreeMyList(MyList*list);
〃插入在尾部
voidmyListInsertDataAtLast(MyList*constlist,void*constdata);
〃插入在首部
voidmyListlnsertDataAtFirst(MyList*constlist,void*constdata);
〃插入
voidmyListlnsertDataAt(MyList*constlist,void*constdata,intindex);
〃刪除在尾部
void*myListRemoveDataAtLast(MyList*constlist);
〃刪除在首部
void*myListRemoveDataAtFirst(MyList*constlist);
〃刪除
void*myListRemoveDataAt(MyList*constlist,intindex);
〃刪除對象,返回是否刪除成功
intmyListRemoveDataObject(MyList*constlist,void*data);
〃長度
intmyListGetSize(constMyList*constlist);
〃打印
voidmyListOutput(constMyList*constlist,void(*pt)(constvoid*const));
〃取得數(shù)據(jù)
void*myListGetDataAt(constMyList*constlist,intindex);
〃取得第?個數(shù)據(jù)
void*myListGetDataAtFirst(constMyList*constlist);
〃取得最后一個數(shù)據(jù)
void*myListGetDataAtLast(constMyList*constlist);
〃查找某個數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
〃如果不存在返回-1,如果存在,返回出現(xiàn)的第一個位置
intmyListFindDataIndex(constMyList*constlist,void*data);
〃創(chuàng)建遍歷般
MyListlterator*createMyListIterator(constMyList*constlist);
〃釋放遍歷器
voidfreeMyListIterator(MyListlterator*iterator);
〃遍歷器是否有下?個元素
intmyListIteratorHasNext(constMyListlterator*constiterator);
〃返回遍歷器的下一個元素
void*myListIteratorNext(MyListIterator*constiterator);
#endif//MYLIST_H_INCLUDED
源文件
/*************************
***FilemyList.c
**************************I
#include"myList.h"
#include<stdlib.h>
〃創(chuàng)建鏈表
MyList*createMyList()
{
MyList*re=(MyList*)malloc(sizeof(MyList));
re->count=0;
re->first=NULL;
re->last=NULL;
re->equal=NULL;
returnre;
}
〃釋放鏈表
voidfreeMyList(MyList*list)
{
MyNode*p;
while(list->first)
(
p=list->first->next;
free(list->first);
list->first=p;
)
free(list);
)
〃插入在尾部
voidmyListInsertDataAtLast(MyList*constlist,void*constdata)
(
MyNode*node=(MyNode*)malloc(sizeof(MyNode));
node->data=data;
node->next=NULL;
if(list->count)
(
list->last->next=node;
list->last=node;
}
else
(
list->first=node;
list->last=node;
)
(list->count)++;
}
〃插入在首部
voidmyListlnsertDataAtFirst(MyList*constlist,void*constdata)
{
MyNode*node=(MyNode*)malloc(sizeof(MyNode));
node->data=data;
node->next=NULL;
if(list->count)
{
node->next=list->first;
list->first=node;
)
else
<
list->first=node;
list->last=node;
}
(list->count)++;
}
〃長度
intmyListGetSize(constMyList?constlist)
returnlist->count;
}
〃打印
voidmyListOutput(constMyList*constlist,void(*pt)(constvoid*const))
{
MyNode*p=list->first;
while(p)
{
(*pt)(p->data);
p=p->next;
}
)
〃刪除在尾部
void*myListRemoveDataAtLast(MyList*constlist)
(
if(list->count==1)
<
returnmyListRemoveDataAtFirst(list);
)
MyNode*p=list->first;
while(p->next!=list->last)
p=p->next;
}
void*re=list->last->data;
free(list->last);
p->next=NULL;
list->last=p;
(list->count)--;
returnre;
}
〃刪除在首部
void*myListRemoveDataAtFirst(MyList*constlist)
{
MyNode*p=list->first;
list->first=p->next;
void*re=p->data;
free(p);
(list->count)--;
if(list->count==0)
(
list->last=NULL;
}
returnre;
}
〃插入
voidmyListInsertDataAt(MyList*constlist,void*constdata,intindex)
{
if(index==0)
myListInsertDataAtFirst(list,data);
return;
)
if(index==list->count)
<
myListInsertDataAtLast(list,data);
return;
}
MyNode*node=(MyNode*)malloc(sizeof(MyNode));
node->data=data;
node->next=NULL;
MyNode*p=list->first;
for(inti=0;i<index-1;i++)
{
p=p->next;
)
node->next=p->next;
p->next=node;
(list->count)++;
}
〃刪除
void*myListRemoveDataAt(MyList*constlist,intindex)
{
if(index==0)
returnmyListRemoveDataAtFirst(list);
}
if(index==list->count-1)
(
returnmyListRemoveDataAtLast(list);
)
MyNode*p=list->first;
for(inti=0;i<index-1;i++)
(
p=p->next;
)
MyNode*tp=p->next;
p->next=p->next->next;
void?re=tp->data;
free(tp);
(list->count)--;
returnre;
)
〃取得數(shù)據(jù)
void*myListGetDataAt(constMyList*constlist,index)
{
if(index==list->count-1)
{
returnmyListGetDataAtLast(list);
}
MyNode*p=list->first;
for(inti=0;i<index;i++)
{
p=p->next;
)
returnp->data;
}
〃取得第一個數(shù)據(jù)
void*myListGetDataAtFirst(constMyList*constlist)
{
returnlist->first->data;
}
〃取得最后一個數(shù)據(jù)
void*myListGetDataAtLast(constMyList*constlist)
{
returnlist->last->data;
}
〃查找某個數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
〃如果不存在返回-1,如果存在,返回出現(xiàn)的第一個位置
intmyListFindDataIndex(constMyList*constlist,void*data)
{
MyNode*p=list->first;
intre=0;
if(list->equal)
{
while(p)
if(p->data==data||(*(list->equal))(p->data,data))
{
returnre;
}
re++;
p=p->next;
)
)
else
{
while(p)
(
if(p->data==data)
{
returnre;
}
re++;
p=p->next;
)
}
return-1;
}
〃創(chuàng)建鏈表,帶有相等參數(shù),用于查找
MyList?createMySearchList(int(*equal)(void*a,void?b))
MyList*re=createMyList();
re->equal=equal;
returnre;
}
〃創(chuàng)建遍歷器
MyListlterator*createMyListIterator(constMyList*constlist)
{
MyListlterator*re=(MyListlterator*)malloc(sizeof(MyListlterator));
re->p=list->first;
re->allSize=list->count;
re->count=0;
returnre;
}
〃釋放遍歷器
voidfreeMyListIterator(MyListIterator*iterator)
{
free(iterator);
}
〃遍歷器是否有下一個元素
intmyListIteratorHasNext(constMyListlterator*constiterator)
{
returniterator->count<iterator->allSize;
}
〃返回遍歷器的下一個元素
void*myListIteratorNext(MyListIterator*constiterator)
{
void*re=iterator->p->data;
iterator->p=iterator->p->next;
(iterator->count)++;
returnre;
}
〃刪除對象,返回是否刪除成功
intmyListRemoveDataObject(MyList*constlist,void*data)
{
MyListlterator*it=createMyListlterator(list);
inta=0;
while(myListlteratorHasNext(it))
{
void*Id=myListlteratorNext(it);
if(data==Id||(list->equal!=NULL&&(*(list->equal))(Id,data)))
{
a=1;
break;
)
}
if(a)
(
myListRemoveDataAt(list,it->count-1);
)
returna;
測試文件
/*************************
***Filemain.c
***testforMyList
**************************/
#include<stdio.h>
ttinclude<stdlib.h>
#include"myList.h"
typedefstructa
{
inti;
charc;
)A;
voidppt(constvoid*constp)
{
A*pp=p;
printf("%d(%c)”,pp->i,
}
intmain()
constintS=10;
〃創(chuàng)建并初始化數(shù)據(jù)
A*d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房屋代理買賣合同(含貸款服務(wù))3篇
- 團隊溝通如何促進成員互動提高協(xié)作效率考核試卷
- 學(xué)前教育的幼兒環(huán)保與可持續(xù)考核試卷
- 2025年度銀行卡小額免密支付授權(quán)管理合同
- 2025年度魚品質(zhì)量檢測與魚買賣服務(wù)合同
- 公共設(shè)施數(shù)據(jù)管理與分析考核試卷
- 塑料產(chǎn)品研發(fā)與創(chuàng)新考核試卷
- 合成纖維的表面活性劑處理考核試卷
- 信托公司業(yè)務(wù)流程風(fēng)險管理考核試卷
- 企業(yè)市場預(yù)測與需求分析考核試卷
- 人教版小學(xué)英語各冊單詞表(帶英標)
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年六年級上學(xué)期期末考試數(shù)學(xué)試題
- SONY索尼數(shù)碼照相機DSC-HX200使用說明書
- 電子電工實驗室項目可行性研究報告
- 2024中國保險發(fā)展報告-中南大風(fēng)險管理研究中心.燕道數(shù)科
- 醫(yī)院突發(fā)事件應(yīng)急預(yù)案工作總結(jié)
- 《海底電力電纜輸電工程施工及驗收規(guī)范》
- (試題)考試護理應(yīng)急預(yù)案題庫與答案
- 【閱讀提升】部編版語文五年級下冊第一單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 園區(qū)招商引資方案提成方案
評論
0/150
提交評論