版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表的具體代碼,供大家參考,具體內(nèi)容如下
忽然想起來(lái),大概在兩年之前學(xué)習(xí)C語(yǔ)言的時(shí)候,曾經(jīng)用C語(yǔ)言寫(xiě)過(guò)一些通用的數(shù)據(jù)結(jié)構(gòu)。主要也
就實(shí)現(xiàn)了鏈表、隊(duì)列、椎、HashSet,還有HashMap。當(dāng)時(shí)只是知道標(biāo)準(zhǔn)的C語(yǔ)言中沒(méi)有這方面的
類庫(kù),后來(lái)才知道有很多第三方的類似這樣的類庫(kù)。廢話不多說(shuō),先把代碼粘過(guò)來(lái)。
下面實(shí)現(xiàn)的是通用鏈表,注意鏈表中只存儲(chǔ)了指針,沒(méi)有儲(chǔ)存實(shí)際的數(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);
〃刪除對(duì)象,返回是否刪除成功
intmyListRemoveDataObject(MyList*constlist,void*data);
〃長(zhǎng)度
intmyListGetSize(constMyList*constlist);
〃打印
voidmyListOutput(constMyList*constlist,void(*pt)(constvoid*const));
〃取得數(shù)據(jù)
void*myListGetDataAt(constMyList*constlist,intindex);
〃取得第?個(gè)數(shù)據(jù)
void*myListGetDataAtFirst(constMyList*constlist);
〃取得最后一個(gè)數(shù)據(jù)
void*myListGetDataAtLast(constMyList*constlist);
〃查找某個(gè)數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
〃如果不存在返回-1,如果存在,返回出現(xiàn)的第一個(gè)位置
intmyListFindDataIndex(constMyList*constlist,void*data);
〃創(chuàng)建遍歷般
MyListlterator*createMyListIterator(constMyList*constlist);
〃釋放遍歷器
voidfreeMyListIterator(MyListlterator*iterator);
〃遍歷器是否有下?個(gè)元素
intmyListIteratorHasNext(constMyListlterator*constiterator);
〃返回遍歷器的下一個(gè)元素
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)++;
}
〃長(zhǎng)度
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;
}
〃取得第一個(gè)數(shù)據(jù)
void*myListGetDataAtFirst(constMyList*constlist)
{
returnlist->first->data;
}
〃取得最后一個(gè)數(shù)據(jù)
void*myListGetDataAtLast(constMyList*constlist)
{
returnlist->last->data;
}
〃查找某個(gè)數(shù)據(jù)的位置,如果equal方法為空,比較地址,否則調(diào)用equal方法
〃如果不存在返回-1,如果存在,返回出現(xiàn)的第一個(gè)位置
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);
}
〃遍歷器是否有下一個(gè)元素
intmyListIteratorHasNext(constMyListlterator*constiterator)
{
returniterator->count<iterator->allSize;
}
〃返回遍歷器的下一個(gè)元素
void*myListIteratorNext(MyListIterator*constiterator)
{
void*re=iterator->p->data;
iterator->p=iterator->p->next;
(iterator->count)++;
returnre;
}
〃刪除對(duì)象,返回是否刪除成功
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;
測(cè)試文件
/*************************
***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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑項(xiàng)目竣工匯報(bào)方案
- 防腐蝕工程費(fèi)用管控方案
- 水利工程環(huán)保措施落實(shí)方案
- 工地物料使用流程標(biāo)準(zhǔn)化方案
- 江鈴馭勝培訓(xùn)
- 機(jī)械化土石方作業(yè)技術(shù)方案
- 工地物料存放安全規(guī)范方案
- 水利工程施工風(fēng)險(xiǎn)評(píng)估方案
- 消防設(shè)施運(yùn)行維護(hù)手冊(cè)編制方案
- 2026年體育理論基礎(chǔ)知識(shí)與運(yùn)動(dòng)技能測(cè)試題
- 貸款貨車買賣合同范本
- 2025-2026學(xué)年湖北省襄陽(yáng)市襄城區(qū)襄陽(yáng)市第四中學(xué)高一上學(xué)期9月月考英語(yǔ)試題
- 醫(yī)院網(wǎng)絡(luò)安全保障方案與實(shí)施步驟
- 綠色化學(xué)綠色溶劑課件
- 弱電智能化系統(tǒng)設(shè)計(jì)方案匯報(bào)
- 我們一起迎戰(zhàn)中考初三家長(zhǎng)會(huì)課件
- 醫(yī)院醫(yī)保上傳數(shù)據(jù)質(zhì)量控制規(guī)范
- 2025年蘭大一院護(hù)理題庫(kù)及答案
- 2025華晉焦煤井下操作技能人員招聘100人(山西)模擬試卷附答案詳解
- 軍人離婚申請(qǐng)書(shū)樣本
- 地質(zhì)災(zāi)害應(yīng)急演練腳本
評(píng)論
0/150
提交評(píng)論