栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基数排序算法实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基数排序算法实现

这个是《数据结构与算法C语言实现》的链表内容
radixSort.h

#ifndef RADIX_SORT_H
#define RADIX_SORT_H

typedef struct node * Node;
struct node
{
  int num;
  Node next;
};

typedef Node Head;

void insert(const Head head, const Node newNode);
void deleteNode(const Head head, Node delNode);
void displayAll(const Head *);
#endif

radixSort.c

#include "radixSort.h"
#define N 10

// 在链表的最后插入一个节点,这个aNode需要是malloc出来的,因为是传址,不是传值
void insert(Head head, Node aNode)
{
  if (head->next == NULL)
  {
    head->next = aNode;
    aNode->next = NULL;
  }
  else
  {
    //得到链表最后节点
    Node tmpNode = head->next;
    while (tmpNode->next != NULL)
    {
      tmpNode = tmpNode->next;
    }
    printf("末尾插入节点 %d n", aNode->num);
    tmpNode->next = aNode;
    aNode->next = NULL;
  }
}

// 在链表中删除节点delNode
void deleteNode(const Head head, const Node delNode)
{
  // 如果head本身就是空,那么什么也不做
  if (head->next != NULL)
  {
    // 找到和delNode->num相同的节点
    Node tmpNode = head->next;
    Node prevNode = head;
    while (tmpNode->next != NULL && tmpNode->num != delNode->num)
    {
      prevNode = tmpNode;
      tmpNode = tmpNode->next;
    }

    if(tmpNode->next == NULL && tmpNode->num != delNode->num)
    {
      printf("没有找到aNode !!! n");
      fflush(stdout);
    }
    else if (tmpNode->next == NULL && tmpNode->num == delNode->num)
    {
      printf("在链表 《最后》 找到aNode %d,删除之 !!! n", tmpNode->num);
      prevNode->next = tmpNode->next;
      // free(tmpNode);
    }
    else if (tmpNode->num == delNode->num)
    {
      printf("在链表 《中间》 找到aNode %d,删除之 !!! n", tmpNode->num);
      prevNode->next = tmpNode->next;
      // free(tmpNode);
    }

    
    
  }
}

void displayAll(const Head * head)
{  
  printf("n==============================n");
  for(int i = 0; i < N; i++)
  {
    // printf("head %d,%p,%p-", i, *(head + i),(*(head + i))->next);
    printf("head %d : ", i);
    fflush(stdout);
    Node tempNode = (*(head + i))->next;
    if (tempNode != NULL)
    {
      // printf("%d,%p,%p>", tempNode->num, tempNode, tempNode->next);
      printf("%d->", tempNode->num);
      fflush(stdout);
      while(tempNode->next != NULL)
      {
        // printf("%d,%p,%p>", tempNode->num, tempNode, tempNode->next);
        printf("%d->", tempNode->next->num);
        fflush(stdout);
        tempNode = tempNode->next;
      }
    }
    printf("n");
  }
  printf("==============================n");
}

radixSortTest.c

#include 
#include 
#include "radixSort.c"
#include 
#include 

#define M 10
#define P 3 // P是numbers中最大数的N^P的次数

int main()
{
  int numbers[M] = {64, 878, 265, 512, 27, 730, 0, 1, 343, 898};
  Head *head = (Head *)malloc(sizeof(Head *) * N);

  // 建立一个指向Head的指针
  for (int i = 0; i < N; i++)
  {
    Head tmpHead = (Head)malloc(sizeof(Head));
    tmpHead->num = i;
    tmpHead->next = NULL;
    *(head + i) = tmpHead;
    // printf("%d is , next is %x n", (*(head + i))->num, (*(head + i))->next);
  }

  // 把numbers数组中的数字装入链表的节点中,并插入到*(head+i)后
  for (int i = 0; i < N; i++)
  {
    Node tmpNode = (Node)malloc(sizeof(Node)); // 这里Node和struct node 一样?
    tmpNode->num = numbers[i];
    tmpNode->next = NULL;
    // printf("%d - %x n", tmpNode->num, tmpNode->next);
    int geWei = tmpNode->num % 10;
    assert(geWei >= 0);
    assert(geWei < N);
    insert(*(head + geWei), tmpNode);
  }

  displayAll(head);

  // 开始遍历
  for (int j = 1; j < P; j++)
  {
    // 从第一个链表开始遍历,先比较十位(j == 1),后比较百位(j == 2)
    if (j == 1)
    {
      printf("从 十位 开始比较 n");
      getchar();
    }
    else
    {
      printf("从 百位 开始比较 n");
      getchar();
    }

    for (int i = 0; i < N; i++)
    {
      Node aNode = (*(head + i))->next;

      //如果链表不空
      if (aNode != NULL)
      {
        printf("n对节点 %d 进行操作 n", aNode->num);
        int wei = (aNode->num / (int)pow(10, j)) % 10;
        assert(wei >= 0);
        assert(wei < 10);

        if (wei == i)
          aNode = aNode->next;
        else
        {
          // aNode 不是最后一个节点
          while (aNode->next != NULL)
          {
            wei = (aNode->num / (int)pow(10, j)) % 10;
            assert(wei >= 0);
            assert(wei < 10);

            // 在链表 *(head +i) 上删除节点aNode
            printf("head %d:::delete %d  n", i, aNode->num);
            deleteNode(*(head + i), aNode);

            // 在链表 *(head + wei)上插入节点aNode
            printf("head %d:::insert %d  n", wei, aNode->num);

            Node insertNode = (Node)malloc(sizeof(Node));
            insertNode->next = aNode->next;
            insertNode->num = aNode->num;
            insert(*(head + wei), insertNode);

            Node node2free = aNode;
            aNode = aNode->next;
            free(node2free);

            displayAll(head);
          }

          // aNode 是最后一个节点
          if (aNode->next == NULL)
          {
            wei = (aNode->num / (int)pow(10, j)) % 10;
            assert(wei >= 0);
            assert(wei < 10);

            // 在链表 *(head +i) 上删除节点aNode
            printf("head %d:::delete last %d n", i, aNode->num);
            deleteNode(*(head + i), aNode);

            // 在链表 *(head + wei)上插入节点aNode
            printf("head %d:::insert last %d n", wei, aNode->num);

            Node insertNode = (Node)malloc(sizeof(Node));
            insertNode->next = aNode->next;
            insertNode->num = aNode->num;
            insert(*(head + wei), insertNode);
            displayAll(head);
            getchar();

            Node node2free = aNode;
            aNode = aNode->next;
            free(node2free);
            displayAll(head);
            getchar();
          }
        }
      }
    }
  }

  return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号