//file : LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ #include<malloc.h> typedef struct { //DataType 的定义可以根据实际开发需求更改 char name[31]; char number[41]; double score; }DataType; typedef struct node{ DataType data; struct node*next; }Node,*LinkList; typedef int (*FindFunc)(DataType); //辅助函数类型(指针) typedef void (*NormalFunc)(DataType*); //辅助函数类型(指针) LinkList InitList(void); const DataType* GetData(LinkList list,int index); void SetData(LinkList list,int index,DataType newData); void Append(LinkList list,DataType newData); int Insert(LinkList list,int index,DataType newData); int Delete(LinkList list,int index,DataType *p_deleteData); void Traverse(LinkList list,NormalFunc func); int Find(LinkList list,FindFunc func); int Length(LinkList list); int Empty(LinkList list); void Destroy(LinkList list); #endif
//file : LinkList.cpp #include"LinkList.h" //链表使用前, 先初始化链表 //构建头结点 LinkList InitList(void) { Node*head; head = new Node; head->next = NULL; return head; } //获取链表中的下标为index 的数据域元素,返回这个数据的地址 const DataType* GetData(LinkList list,int index) { Node *p = list->next; int i = 0; if(index<0) return NULL; //index为负数 while(p!=NULL&&i<index) { p=p->next; ++i; } if(p==NULL) return NULL; //index过大 return &(p->data) ; } //将链表中下标为index 的结点的数据域设定为data //注意:没做边界检查 void SetData(LinkList list,int index,DataType newData) { Node*p = list->next; int i=0; if(index<0) return ; while(p!=NULL && i<index) { p=p->next; ++i; } if(p==NULL) return ; p->data = newData; } //追加一个节点到链表的末尾 void Append(LinkList list,DataType newData) { Node*p = list; Node*p_newNode; while(p->next!=NULL) { p = p->next; } p_newNode = new Node; p_newNode->data = newData; p_newNode->next = NULL; p->next = p_newNode; } //插入 :在链表中 将newData插入下标为index 的位置, //返回值: 是否插入成功 int Insert(LinkList list,int index,DataType newData) { Node*p = list; int i=0; Node*p_newNode; if(index<0) return 0; //index为负数 while(p != NULL && i<index) { p=p->next; ++i; } if(p==NULL) //index超出范围 { return 0; //删除失败 } p_newNode = new Node; p_newNode->data = newData; p_newNode->next = p->next; p->next = p_newNode; return 1; } //删除节点:删除链表中下标为index 的结点,如果接口使用者需要获取这个 //被删除的元素,则 传入一个存储的地址,否则传入NULL //返回值:是否删除成功 int Delete(LinkList list,int index,DataType *p_deleteData) { Node*p = list; int i=0; Node*t; if(index<0) return 0; while(p->next != NULL && i<index) { p=p->next; ++i; } if(p->next==NULL) //超出范围 { return 0; } t= p->next; p->next = p->next->next; if(p_deleteData!=NULL) //如果传入的不为空指针,表明用户需要接受删除的那个数据。 { *p_deleteData = t->data; } free(t); return 1; } void Traverse(LinkList list,NormalFunc func) { Node*p = list->next; while(p!=NULL) { func(&(p->data)); p=p->next; } } //用户自己写FindFunc , 满足某个条件,则func返回true。 int Find(LinkList list,FindFunc func) { Node* p = list->next; int index = 0; while(p!=NULL) { if(func(p->data)) return index; p=p->next; index++; } return -1; } //获取链表的数据个数 int Length(LinkList list) { int count = 0; Node*p = list->next; while(p!=NULL) { count++; p=p->next; } return count; } //链表是否为空 int Empty(LinkList list) { return list->next == NULL; } //销毁链表 void Destroy(LinkList list) { Node*t; while(list!=NULL) { t = list; list=list->next; free(t); } }
不知道有没有BUG 暂时没发现。(*^__^*)
时间: 2024-11-10 01:25:42