C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之鏈表_第1頁
C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之鏈表_第2頁
C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之鏈表_第3頁
C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之鏈表_第4頁
C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)之鏈表_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rè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)時只是知道標(biāo)準(zhǔn)的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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論