標籤

2013年7月11日 星期四

排序前的準備

要做sorting之前,必須把資料儲存起來.
這邊使用了link list是為了能夠動態儲存使用者資料
原因在於我們不能預知使用者到底會輸入多少資料, 當然我們也可以使用c++的vector之類的東西, 只是在此並沒有使用.
而動態儲存至link list之後把它轉成array方便做sorting.
如果不曉得link list之後會介紹,在此只需要把程式碼直接copy過去即可.
其實程式真的不長,只是為了打上說明所以才變得這麼長
在此程式碼不多做說明,因為這只是事前的準備,個人在程式碼部分有打上簡單的說明,當然有些地方因個人英文不好,所以打出來的說明也許不是這麼清楚又或是文法有缺漏.
敬請多加包含.
ps:在此預設了輸入的value是integer.

#include <stdio.h>
#include <stdlib.h>

// structure for link list
typedef struct data_node {
   int data;                    // save data
   struct data_node *next;      // next node
} data_node;

// declare head and tail node pointer
data_node *head, *tail;

// save the data to the tail of the link list
void put_to_tail(int d)
{
   // create a node with data value d
   data_node *node;
   node = (data_node*) malloc(sizeof(data_node));
   node->data = d;

   node->next = NULL; // no follower

   // if this is the first node
   if (head == NULL)
      // then this one is head and also tail
      head = tail = node;
   else { // if there are existing nodes
      // then put that node to the last position
      tail->next = node;
      tail = node;
   }
}

// show each elements of the link list
// and return the number of the elements
unsigned show_list_and_size(void)
{
   if (head == tail)
      error_msg("please put in values");
   // number of the elements of the link list
   unsigned num = 0;
   printf("data list is the following:\n");

   // explorer of the list
   data_node *rush, *prev;
   // beginning position
   rush = head;
   // if it is not the end
   while (rush != NULL) {
      // then continue to explore
      // keep the previous position
      prev = rush;
      // explore the next node
      rush = rush->next;
      // print out the data
      printf("%d ", prev->data);
      // accumulate the number
      num++;
   }
   puts("");
   // return the number of the elements
   return num;
}

// put the data from the link list to array a
void list_to_arry(int *a)
{
   data_node *rush, *prev;

   // beginning position
   rush = head;
   // array index start from 0
   unsigned i = 0;

   // if it is not the end
   while (rush != NULL) {
      // then continue to explore
      // keep the previous position
      prev = rush;
      // put that data to the arrary
      a[i++] = prev->data;      
      // explore the next node
      rush = rush->next;
    }
}

// print out the error message
void error_msg(char *msg)
{
   fprintf(stderr, "%s\n", msg);
   exit(1);
}

int main(void)
{
   // initialize head and tail as NULL
   head = NULL;
   tail = NULL;

   printf("Enter the numbers:");
   int data;

   // if user is still input the data,
   // then put it to the tail of the link list
   while (scanf("%d", &data) != EOF)
      put_to_tail(data);

   // show all the elements and get the size
   unsigned arry_size = show_list_and_size();

   // allocate the arrary
   int *a = (int*) malloc(sizeof(int) * arry_size);
   // put the data from the list to that array
   list_to_arry(a);


   // allocate another array for showing the sorted result
   int *b = (int*) malloc(sizeof(int) * arry_size);
   int i;

   // initilize it as the original array
   for (i = 0; i < arry_size; ++i)
      b[i] = a[i];
   ///////////////////////////////
   //        func               //

   free(a);
   free(b);

   return 0;
}



沒有留言:

張貼留言