深入解析C++的循环链表与双向链表设计的API实现

2020-01-06 14:55:35于海丽

joseph.h  


// 用循环链表API求解约瑟夫问题 
 
#include <cstdio> 
#include "circlelist.h" 
 
const int maxp = 8; 
 
struct Person 
{ 
  CircleListNode circlenode; 
  int id; 
}; 
 
void joseph() 
{ 
  Person s[maxp]; 
  for (int i = 0; i < maxp; ++i) { 
    s[i].id = i + 1; 
  } 
 
  CircleList *list = NULL; 
  list = CircleList_Create(); 
 
  // 插入元素 
  for (int i = 0; i < maxp; ++i) { 
    // 尾插法 
    int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list)); 
    if (ret < 0) { 
      printf("function CircleList_Insert err: %dn", ret); 
    } 
  } 
 
  // 遍历链表 
  for (int i = 0; i < CircleList_Length(list); ++i) { 
    Person *tmp = (Person *)CircleList_Get(list, i); 
    if (tmp == NULL) { 
      printf("function CircleList_Get err.n"); 
    } 
    printf("age: %dn", tmp->id); 
  } 
 
  // 求解约瑟夫问题 
  while (CircleList_Length(list) > 0) 
  { 
    Person* pv = NULL; 
    for (int i = 1; i < 3; i++) 
    { 
      CircleList_Next(list); 
    } 
    pv = (Person*)CircleList_Current(list); 
    printf("%d ", pv->id); 
    CircleList_DeleteNode(list, (CircleListNode *)pv); //根据结点的值,进行结点元素的删除 
  } 
  printf("n"); 
 
  CircleList_Destroy(list); 
 
} 

main.cpp  


// 循环链表测试程序 
 
#include <iostream> 
#include <cstdio> 
#include "circlelist.h" 
#include "joseph.h" 
 
const int maxn = 5; 
 
struct Student 
{ 
  CircleListNode circlenode; 
  char name[32]; 
  int age; 
}; 
 
void play01() 
{ 
  Student s[maxn]; 
  for (int i = 0; i < maxn; ++i) { 
    s[i].age = i + 1; 
  } 
 
  CircleList *list = NULL; 
 
  list = CircleList_Create(); // 创建链表 
 
  // 插入元素 
  for (int i = 0; i < maxn; ++i) { 
    // 尾插法 
    int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list)); 
    if (ret < 0) { 
      printf("function CircleList_Insert err: %dn", ret); 
    } 
  } 
 
  // 遍历链表 
  // 这里遍历打印两边,可以证明这是一个循环链表 
  for (int i = 0; i < 2 * CircleList_Length(list); ++i) { 
    Student *tmp = (Student *)CircleList_Get(list, i); 
    if (tmp == NULL) { 
      printf("function CircleList_Get err.n"); 
    } 
    printf("age: %dn", tmp->age); 
  } 
 
  // 删除结点,通过结点位置 
  while (CircleList_Length(list)) { 
    Student *tmp = (Student *)CircleList_Delete(list, CircleList_Length(list) - 1); 
    if (tmp == NULL) { 
      printf("function CircleList_Delete err.n"); 
    } 
    printf("age: %dn", tmp->age); 
  } 
 
  // 销毁链表 
  CircleList_Destroy(list); 
 
} 
 
int main() 
{ 
  play01(); // 为了测试数据的生命周期,所以另写一个函数调用运行 
  joseph(); 
 
  return 0; 
}