|
本帖最后由 qiao141486 于 2020-4-28 23:24 编辑
- #ifndef CIRCLELINKLIST
- #define CIRCLELINKLIST
- #include <stdio.h>
- #include <stdlib.h>
- #define CIRCLELINKLIST_TRUE 1
- #define CIRCLELINKLIST_FALSE 0
- //链表小结点
- typedef struct CIRCLELINKNODE{
- struct CIRCLELINKNODE * next;
- }CircleLinkNode;
- //链表结构体
- typedef struct CIRCLELINKLIST{
- CircleLinkNode head;
- int size;//判断循环是否停止的标志
- }CircleLinkList;
- //编写针对链表结构体操作的API函数
- //比较回调
- typedef void(*PRINTLINKLIST)(CircleLinkNode *);
- typedef int(*COMPARENODE)(CircleLinkNode *, CircleLinkNode *);
- //初始化函数
- CircleLinkList * Init_CircleLinkList();
- //插入函数
- void Insert_CircleLinkList(CircleLinkList * clist, int pos, CircleLinkNode* data);
- //根据位置删除
- void RemoveByPos_CircleLinkList(CircleLinkList * clist, int pos);
- //根据值删除函数
- void RemoveByValue_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare);
- //获取链表的长度
- int Size_CircleLinkList(CircleLinkList * clist);
- //判断是否为空
- int IsEmpty_CircleLinkList(CircleLinkList * clist);
- //返回第一个元素
- CircleLinkNode * Front_CircleLinkList(CircleLinkList * clist);
- int Find_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare);
- //打印
- void Print_CircleLinkList(CircleLinkList * clist, PRINTLINKLIST print);
- //释放
- void FreeSpace_CircleLinkList(CircleLinkList * clist);
- #endif
复制代码- #include "CircleLinkList.h"
- //初始化函数
- CircleLinkList * Init_CircleLinkList(){
- CircleLinkList *clist = (CircleLinkList *)malloc(sizeof(CircleLinkList));
- clist->head.next = &(clist->head);//指向自己
- clist->size = 0;
- return clist;
- }
- //插入函数
- void Insert_CircleLinkList(CircleLinkList * clist, int pos, CircleLinkNode* data){
- if (clist == NULL)
- {
- return;
- }
- if (data == NULL)
- {
- return;
- }
- if (pos < 0 || pos >= clist->size)
- {
- pos = clist->size;
- }
- //根据位置查找结点
- //辅助指针变量
- CircleLinkNode * pCurrent = &(clist->head);
- for (int i = 0; i < pos; i++)
- {
- pCurrent = pCurrent->next;
- }
- data->next = pCurrent->next;
- pCurrent->next = data;
- clist->size++;
- }
- //根据位置删除
- void RemoveByPos_CircleLinkList(CircleLinkList * clist, int pos){
- if (clist == NULL)
- {
- return;
- }
- if (pos < 0 || pos >= clist->size){
- return;
- }
- CircleLinkNode * pCurrent = &(clist->head);
- for (int i = 0; i < pos; i++){
- pCurrent = pCurrent->next;
- }
- //缓存当前结点的下一个结点
- CircleLinkNode * pNext = pCurrent->next;
- pCurrent->next = pNext->next;
- clist->size--;
- }
- //根据值删除函数
- void RemoveByValue_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare){
- if (clist == NULL){
- return;
- }
- if (data == NULL){
- return;
- }
- CircleLinkNode * pPrev = &(clist->head);
- CircleLinkNode * pCurrent = pPrev->next;
- int i = 0;
- for (i = 0; i < clist->size; i++){
- if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE)
- {
- pPrev->next = pCurrent->next;
- break;
- }
- pPrev = pCurrent;
- pCurrent = pPrev->next;
- }
- clist->size--;
- }
- //获取链表的长度
- int Size_CircleLinkList(CircleLinkList * clist){
- return clist->size;
- }
- //判断是否为空
- int IsEmpty_CircleLinkList(CircleLinkList * clist){
- if (clist->size == 0)
- {
- return CIRCLELINKLIST_TRUE;
- }
- return CIRCLELINKLIST_FALSE;
- }
- //返回第一个元素
- CircleLinkNode * Front_CircleLinkList(CircleLinkList * clist){
- return clist->head.next;
- }
- //查找
- int Find_CircleLinkList(CircleLinkList * clist, CircleLinkNode * data, COMPARENODE compare){
- if (clist == NULL)
- {
- return -1;
- }
- if (data == NULL)
- {
- return -1;
- }
- CircleLinkNode * pCurrent = clist->head.next;
- int flag = -1;
- for (int i = 0; i < clist->size; i++)
- {
- if (compare(pCurrent, data) == CIRCLELINKLIST_TRUE){
- flag = i;
- break;
- }
- pCurrent = pCurrent->next;
- }
- return flag;
- }
- //打印
- void Print_CircleLinkList(CircleLinkList * clist, PRINTLINKLIST print){
- if (clist == NULL){
- return;
- }
- CircleLinkNode * pCurrent = clist->head.next;
- for (int i = 0; i < clist->size; i++){
- if (pCurrent == &(clist->head))
- {
- pCurrent = pCurrent->next;
- printf("-------------------------- \n");
- }
- print(pCurrent);
- pCurrent = pCurrent->next;
- }
- }
- void FreeSpace_CircleLinkList(CircleLinkList * clist)
- {
- if (clist == NULL){
- return;
- }
- free(clist);
- }
复制代码- #define _CRT_CECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "CircleLinkList.h"
- #define M 8
- #define N 3
- typedef struct MYNUM {
- CircleLinkNode node;
- int val;
- }MyNum;
- void MyPrint(CircleLinkList * data){
- MyNum* num = (MyNum*)data;
- printf("%d ", num->val);
- }
- int MyCompare(CircleLinkNode * data1, CircleLinkNode * data2){
- MyNum * num1 = (MyNum*)data1;
- MyNum* num2 = (MyNum*)data2;
- if (num1->val == num2->val){
- CIRCLELINKLIST_TRUE;
- }
- CIRCLELINKLIST_FALSE;
- return 0;
- }
- int main(void){
- CircleLinkList * clist = Init_CircleLinkList();
- MyNum num[M];
- for (int i = 0; i < 8; i++){
- num[i].val = i + 1;
- Insert_CircleLinkList(clist, i, (CircleLinkNode *)&num[i]);
- }
- Print_CircleLinkList(clist, MyPrint);
- printf("\n");
- //FreeSpace_CircleLinkList(clist);
- //辅助指针
- int index = 1;
- CircleLinkNode * pCurrent = clist->head.next;
- while (Size_CircleLinkList(clist) > 1){
- if (index == N){
- MyNum* temNum = (MyNum*)pCurrent;
- printf("%d ", temNum->val);
- //缓存待删除结点的下一个结点
- CircleLinkNode * pNext = pCurrent->next;
- //根据值去删除
- RemoveByValue_CircleLinkList(clist, pCurrent, MyCompare);
- pCurrent = pNext;
- if (pCurrent == &(clist->head)){
- pCurrent = pCurrent->next;
- }
- index = 1;
- }
- pCurrent = pCurrent->next;
- if (pCurrent == &(clist->head)){
- pCurrent = pCurrent->next;
- }
- index++;
- }
- if (Size_CircleLinkList(clist) == 1){
- MyNum *tempNum = (MyNum*)Front_CircleLinkList(clist);
- printf("%d ", tempNum->val);
- }
- else{
- printf("出错了!");
- }
- printf("\n");
- FreeSpace_CircleLinkList(clist);
- getchar();
- getchar();
- return 0;
- }
复制代码
运行的结果不对,,我自己调试了调试,但找不到错误在哪,请教各位大佬同学
在while循环中把pCurrent的数值先打印一下,发现你的删除函数是有问题的。节点并没有将数据删除。
|
-
上一篇: 使用c++进行Excel文档的读写下一篇: vs2013当中已经和syc老师一样设置了环境为什么还会出现下面的问题?
|