處理任意型別鍊錶模板

2021-10-21 23:42:00 字數 4393 閱讀 1057

標頭檔案:linklist.h

#ifndef   linklist 

#define _crt_secure_no_warnings

#define linklist

#define debug

#define test

#include #include #include //節點

typedef struct linknode

linknode;

//鍊錶

typedef struct linklist

lisklist;

//初始化鍊錶

lisklist* initlinklist();

//在指定位置新增資料

void insertlinklist(lisklist *list,int pos,void *data);

//定義輸出節點指標型別

typedef void (*printnode)(void*);

//輸出鍊錶

void printlinklist(lisklist* list, printnode printnode);

//刪除資料【按位置】

void removelinklist(lisklist* list, int pos);

//獲取鍊錶節點數

int sizelinklist(lisklist* list);

//獲取首節點

void* firstlinklist(lisklist* list);

//查詢節點[按資料位址]

int findlinklist(lisklist* list,void *data);

//釋放

void freelinklist(lisklist* list);

//定義輸出節點指標型別

//typedef void (*compary)(void* sour,void *dest);

//查詢節點【按資料內容】

//int findlinklist(lisklist* list, void *data,compary com);

#endif

原始檔:linklist.c

#include "linklist.h"

//初始化鍊錶

lisklist* initlinklist()

return null;

} return null;

}//在指定位置新增資料

void insertlinklist(lisklist* list, int pos, void* data)

if (data == null)

if (pos<0 || pos>list->size)

//建立新節點

linknode* newnode = (linknode*)malloc(sizeof(linknode));

if (newnode != null)

//新節點插入

newnode->next = pcurrent->next;

pcurrent->next = newnode;

list->size++; }}

//輸出鍊錶

void printlinklist(lisklist* list, printnode printnode)

linknode* pcurrent = null;

pcurrent = list->head->next;

while (pcurrent!=null) }

//刪除資料【按位置】

void removelinklist(lisklist* list, int pos)

if (pos<0 || pos>list->size)

//查詢刪除節點的前乙個節點

linknode* pcurrent = list->head;

for (i = 0; i < pos; i++)

//pcurrent->next= pcurrent->next->next; //此寫法可以刪除節點,但是不能free【釋放要刪除的節點】

//暫存要刪除的節點

linknode* pdel = pcurrent->next;

pcurrent ->next =pdel->next;

free(pdel);

list->size--;

}//獲取鍊錶節點數

int sizelinklist(lisklist* list)

return list->size;

}//獲取首節點資料

void* firstlinklist(lisklist* list)

if (list->size == 0)

return list->head->next->data;

}//查詢節點

int findlinklist(lisklist* list, void* data)

if (data==null)

if (list->size == 0)

linknode* pcurrent = list->head->next;

i = 0;

int leap = -10;

while (pcurrent != null)

pcurrent = pcurrent->next;

i++;

} return leap;

}//釋放

void freelinklist(lisklist* list)

linknode* pfree = list->head;

linknode* pcurrent=null;

while (pfree != null)

#ifdef debug

printf("釋放 %p\n", list);

#endif // debug

free(list);

}

原始檔:main.c

#include "linklist.h"

//自定義資料

typedef struct person

person;

// 自定義資料的輸出

void printnode(void *data)

int main()

; person p2 = ;

person p3 = ;

person p4 = ;

person p5 = ;

person p6 = ;

person p7 = ;

person p9,p10;

//向指定位置新增資料

insertlinklist(list, 0, (void *)&p1);

insertlinklist(list, 0, (void*)&p2);

insertlinklist(list, 0, (void*)&p3);

insertlinklist(list, 0, (void*)&p4);

insertlinklist(list, 0, (void*)&p5);

//輸出

//printlinklist(list, printnode);

insertlinklist(list, 8, (void*)&p6);

//puts("-----------------------------");

//輸出

//printlinklist(list, printnode);

insertlinklist(list, 2, (void*)&p7);

//puts("++++++++++++++++");

//輸出

printlinklist(list, printnode);

printf("節點數:%d\n", sizelinklist(list));

printnode(firstlinklist(list));

//removelinklist(list, 99);

removelinklist(list, 0);

//removelinklist(list, 6);

//removelinklist(list, 3);

puts("++++++++++++++++");

//輸出

printlinklist(list, printnode);

printnode(firstlinklist(list));

printf("節點數:%d\n",sizelinklist(list));

printf("查詢:%d\n",findlinklist(list,(void *) &p10));

freelinklist(list);

return 0;

}

模板 鍊錶模板 有序鍊錶模板及測試

鍊錶模板 c 程式設計 資料結構與程式設計方法 16.2作為抽象資料型別的鍊錶 header file linkedlist.h ifndef linkedlist h define linkedlist h template struct nodetype template class linke...

共用體處理任意型別資料

幾種不同型別的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構 共用體是一種資料格式,它能夠儲存不同的資料型別,但在同一時間只能儲存其中的一種型別。共用體的用途之一是,當資料使用兩種或更多種格式,但不會同時使用這些格式時,可以節省空間。u...

模板順序鍊錶

對於模板這個東西,我感覺好像概念清楚,但一直沒機會動手寫一寫。今天終於動手了,寫了才知道自己還是有很多相關的東西不知道的。今天寫了乙個模板順序鍊錶,還花了不少時間,以後有機會將會寫更多的模板資料結構。下面的資料結構支援記憶體自動增長。有查詢,插入,刪除,賦值等簡單基本操作 ifndef afx xt...