头文件
#ifndef MYLINKLIST_H_INCLUDED
#define MYLINKLIST_H_INCLUDED
#include <stdint.h>
#include <stdbool.h>
typedef struct my_linklist{
int value;
struct my_linklist *Next;
}my_linklist_t;
my_linklist_t *CreatLinklist(uint16_t len);
void DeleteLinklist(my_linklist_t *p);
bool LinklistNodeExists(my_linklist_t *linklist,my_linklist_t *Node);
void appendNodeToLinklist(my_linklist_t *linklist,my_linklist_t *Node);
void deleteLinklistNode(my_linklist_t *linklist,my_linklist_t *Node);
void outputLinklist(my_linklist_t *linklist);
uint32_t getLinklistSize(my_linklist_t *linklist);
int32_t getNodePosition(my_linklist_t *linklist,my_linklist_t *Node);
#endif // MYLINKLIST_H_INCLUDED
C文件
#include "mylinklist.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define __FOR_TEST_USE__
my_linklist_t *CreatLinklist(uint16_t len)
{
my_linklist_t *p =(my_linklist_t *)malloc(sizeof(my_linklist_t));
if(NULL == p)
{
#ifdef __FOR_TEST_USE__
printf("Creat linklist failed,no enough memory.\r\n");
#endif // __FOR_TEST_USE__
}
else
{
p->Next=NULL;
}
return p;
}
void DeleteLinklist(my_linklist_t *p)
{
free(p);
}
bool LinklistNodeExists(my_linklist_t *linklist,my_linklist_t *Node)
{
my_linklist_t *tmp=linklist;
bool isFindNode=false;
while(tmp != NULL)
{
if(tmp->Next == Node)
{
isFindNode = true;
goto FUNCTION_END;
}
else
{
tmp=tmp->Next;
}
}
FUNCTION_END:
return isFindNode;
}
void appendNodeToLinklist(my_linklist_t *linklist,my_linklist_t *Node)
{
my_linklist_t *tmp=linklist;
while(tmp->Next != NULL)
{
tmp=tmp->Next;
}
tmp->Next=Node;
Node->Next=NULL;
}
void deleteLinklistNode(my_linklist_t *linklist,my_linklist_t *Node)
{
my_linklist_t *tmp=linklist;
if((!LinklistNodeExists(linklist,Node))||(tmp->Next == NULL))
{
#ifdef __FOR_TEST_USE__
printf("Error:node is not in the Linklist.\r\n");
#endif // __FOR_TEST_USE__
return;
}
while(tmp!=NULL)
{
if(tmp->Next == Node)
{
break;
}
tmp=tmp->Next;
}
tmp->Next=Node->Next;
}
void outputLinklist(my_linklist_t *linklist)
{
my_linklist_t *tmp=linklist->Next;
while(tmp !=NULL)
{
printf("%d\r\n",tmp->value);
tmp=tmp->Next;
}
}
uint32_t getLinklistSize(my_linklist_t *linklist)
{
my_linklist_t *tmp=linklist->Next;
uint32_t i=0;
while(tmp !=NULL)
{
i++;
tmp=tmp->Next;
}
return i;
}
int32_t getNodePosition(my_linklist_t *linklist,my_linklist_t *Node)
{
uint32_t pos=0;
my_linklist_t *tmp=linklist->Next;
if((!LinklistNodeExists(linklist,Node))||(tmp->Next == NULL))
{
#ifdef __FOR_TEST_USE__
printf("Error:node is not in the Linklist.\r\n");
return -1;
#endif // __FOR_TEST_USE__
}
while(tmp !=NULL)
{
if(tmp!=Node)
pos++;
else
break;
tmp=tmp->Next;
}
return pos;
}
测试程序
#include <stdio.h>
#include <stdlib.h>
#include "mylinklist.h"
int main()
{
my_linklist_t *list1=CreatLinklist(1);
if(list1!=NULL)
{
printf("Creat Linklist Successfully.\r\n");
}
my_linklist_t Node1,Node2,Node3,Node4;
Node1.value=100;
Node2.value=200;
Node3.value=300;
printf("&Node1= %#x\r\n",(uint32_t)&Node1);
printf("&Node2= %#x\r\n",(uint32_t)&Node2);
printf("&Node3= %#x\r\n",(uint32_t)&Node3);
appendNodeToLinklist(list1,&Node1);
appendNodeToLinklist(list1,&Node2);
appendNodeToLinklist(list1,&Node3);
printf("Before:\r\n");
printf("list1 size = %d \r\n",getLinklistSize(list1));
outputLinklist(list1);
printf("=================================\r\n");
printf("Node pos= %d\r\n",getNodePosition(list1,&Node1));
deleteLinklistNode(list1,&Node4);
deleteLinklistNode(list1,&Node2);
printf("After:\r\n");
printf("list1 size = %d \r\n",getLinklistSize(list1));
outputLinklist(list1);
DeleteLinklist(list1);
return 0;
}
运行结果