例程:
简单地写一下企业链表,实现初始化,插入,打印等功能。
/企业链表/
typedef struct LINKNODE09
{ // 定义节点
LINKNODE09 *next;
} linknode09;
// 定义表头
typedef struct LINKLIST09
{ // 定义表头
linknode09 head;
int size;
} linklist09;
linklist09 *initiallist09()
{
linklist09 *linklistp = (linklist09 *)malloc(sizeof(linklist09));
linklistp->head.next = NULL;
linklistp->size = 0;
return linklistp;
}
void freelinklist09(linklist09 *listp)
{
if (listp == NULL)
{
return;
}
free(listp); // 只有表头是在链表程序中添加的,所以只需要释放表头
}
void insertdataforlist09(linklist09 *listp, void *data, int pos)
{
if (listp == NULL)
{
return;
}
if (data == NULL)
{
return;
}
if(pos < 0 && pos > listp->size){
pos = 0;
}
linknode09 *pCurrent = &(listp->head); // 临时节点拿到表头中保存下一个节点指针的地址
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
linknode09 *p = (linknode09 *)data; // 把data转换成linknode类型
p->next = pCurrent->next; // 新节点指向它要插入的节点
pCurrent->next = p; // 新节点前面的节点指向新节点
listp->size += 1;
}
struct person09
{
linknode09 *next;
int age;
};
typedef void (*PRINT09)(void *); // 定义一个函数指针类型
void print09(void *pNode)
{
person09 *pp = (person09 *)pNode;
cout << "age is: " << pp->age << endl;
}
void printlist09(linklist09 *plist, PRINT09 printp)
{
if (plist == NULL)
{
return;
}
// linknode09 * pCurrent = plist->head.next;
// for(int i=0; i< plist->size; i++) {
// print09(pCurrent);
// pCurrent = pCurrent->next;
// }
linknode09 *pCurrent = &(plist->head);
for (int i = 0; i < plist->size; i++)
{
print09(pCurrent->next);
pCurrent = pCurrent->next;
}
}
void test09()
{
person09 p1;
person09 p2;
person09 p3;
person09 p4;
person09 p5;
p1.age = 11;
p2.age = 12;
p3.age = 13;
p4.age = 14;
p5.age = 15;
linklist09 *list09 = initiallist09();
insertdataforlist09(list09, (void *)&p1, 0);
insertdataforlist09(list09, (void *)&p2, 0);
insertdataforlist09(list09, (void *)&p3, 0);
insertdataforlist09(list09, (void *)&p4, 0);
insertdataforlist09(list09, (void *)&p5, -1);
printlist09(list09, print09);
freelinklist09(list09);
}
extern “C” void app_main(void)
{
test09();
}