標頭檔案: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...