list repeat node num

#include <stdio.h>
struct list_SY
{
    struct list_SY *next;
    int data;
};

struct list_SY *listSY;
char data[]={0, 1, 1, 3, 4, 5, 6, 7, 8, 9, 9, 8, 7, 6, 5, 4, 5, 2, 1, 0, 5, 6, 5};
int data_len = sizeof(data)/sizeof(char);

int list_SY_size(struct list_SY *head)
{
    int size = 0;
    struct list_SY *tail = NULL;
    
    if (head==NULL) {
        printf("list is null, head ptr=%p\n", head);
        return 0;
    }
    size++;
    tail = head;
    while(tail->next!=NULL) {
        tail++;
        size++;
    }
    printf("list_SY_size, %d\n", size);
    return size;
}

struct list_SY *list_SY_tail(struct list_SY *head)
{
    struct list_SY *tail = NULL;

    if (head==NULL){
        printf("list is null, head ptr=%p\n", head);
        return NULL;
    }
    tail = head;
    while(tail->next!=NULL)
        tail++;
    //printf("list_SY_tail, tail ptr=%p, \n", tail);
    return tail;
}

struct list_SY *list_SY_search(struct list_SY *head, int data)
{
    struct list_SY *p = NULL;

    if (head==NULL){
        printf("list is null, head ptr=%p\n", head);
        return NULL;
    }
    p = head;
    while(p!=NULL) {
        if(p->data==data)
            break;
        p++;
    }

    return p;
}

void list_SY_add(struct list_SY *head, struct list_SY *node)
{
    struct list_SY *tail=NULL;
    
    //printf("list_SY_add, head ptr=%p, node ptr=%p, data=%d\n", head, node, node->data);
    tail = list_SY_tail(head);
    if (tail==NULL) {
        head = node;
        node->next = NULL;
    } else {
        tail->next = node;
        node->next = NULL;
    }
}

void list_SY_show(struct list_SY *head)
{
    struct list_SY *p;
    int i = 0;
    printf("list_SY_show\n");
    p = head;
    while(p!=NULL){
        printf("node %d: ptr=%p, data=%d\n",i++, p, p->data);
        p = p->next;
    }
}

struct list_SY *list_SY_init(struct list_SY *head, int nodes_num)
{
    int i = 0;
    struct list_SY *p;
    struct list_SY *list_new;
    printf("list_SY_init\n");
    list_new = malloc(nodes_num*sizeof(struct list_SY));
    p = list_new;
    #if 0
    while(i<nodes_num) {
        p->next = NULL;
        p->data = data[i];
        p->next = p+1;
        //list_SY_add(head, p);
        printf("node %d: ptr=%p, data=%d\n",i, p, p->data);
        i++;
        p++;
    }
    #else
    while(i<nodes_num) {
        p->next = NULL;
        p->data = data[i];
        list_SY_add(list_new, p);
        //printf("node %d: ptr=%p, data=%d\n",i, p, p->data);
        i++;
        p++;
    }
    #endif
    p = p-1;
    p->next = NULL;
    head = list_new;
    list_SY_show(head);
    list_SY_size(head);
    return head;
}

int is_in_repeat_data(int *repeat_data, int size, int data)
{
    int is_in = 0;
    int *p = repeat_data;
    while (size--) {
        if(*p==data){
            is_in = 1;
            break;
        } else
            p++;
    }
    return is_in;
}

int is_repeat_in_list(struct list_SY *head, int data)
{
    struct list_SY *p = NULL;
    int is_repeat = 0;
    if (head==NULL){
        printf("list is null, head ptr=%p\n", head);
        return NULL;
    }

    p = head;
    while(p!=NULL) {
        if(p->data==data){
            is_repeat += 1;
        }
        if(is_repeat>=2)
            break;
        p = p->next;
    }
    is_repeat = (is_repeat>=2) ? 0x1 : 0x0;
    //printf("data %d repeat in list=%d\n", data, is_repeat);
    return is_repeat;
}

int list_SY_caclute_repeat_data_num(struct list_SY *head)
{
    int repeat_num = 0;
    int repeat_num_max = 0;
    int list_size = 0;
    int *repeat_data;
    int is_repeat = 0;
    int i = 0;
    list_size =  list_SY_size(head);
    repeat_num_max = list_size/2;
    repeat_data = malloc(repeat_num_max*sizeof(int));
    printf("list_size=%d \n", list_size);
    
    struct list_SY *p;
    
    if (head==NULL)
        return 0;
    p = head;
    while(p!=NULL) {
        printf("node:%2d----------------------\n", i++);
        if (is_in_repeat_data(repeat_data, repeat_num, p->data)) {
            //printf("data %d is in repeat_data_arr\n", p->data);
            p = p->next;
        } else if (is_repeat_in_list(head, p->data)){
            printf("data %d is repeat in list_data\n", p->data);
            repeat_data[repeat_num] = p->data;
            repeat_num++;
            p = p->next;
        } else {
            printf("data %d is not repeat in list_data\n", p->data);
            p = p->next;
        }
    }
    for(i=0;i<repeat_num;i++)
        printf("repeat_data[%2d] = %2d\n", i, repeat_data[i]);
    printf("data---------------------repeat_num = %2d\n", repeat_num);
    return 0;
}

int main()
{
   printf("data_len=%d \n", data_len);
   listSY = list_SY_init(listSY, data_len);
   //is_repeat_in_list(listSY, 11);
   list_SY_caclute_repeat_data_num(listSY);    
   return 0;
}
data_len=23 
list_SY_init
list_SY_show
node 0: ptr=0x2367010, data=0
node 1: ptr=0x2367020, data=1
node 2: ptr=0x2367030, data=1
node 3: ptr=0x2367040, data=3
node 4: ptr=0x2367050, data=4
node 5: ptr=0x2367060, data=5
node 6: ptr=0x2367070, data=6
node 7: ptr=0x2367080, data=7
node 8: ptr=0x2367090, data=8
node 9: ptr=0x23670a0, data=9
node 10: ptr=0x23670b0, data=9
node 11: ptr=0x23670c0, data=8
node 12: ptr=0x23670d0, data=7
node 13: ptr=0x23670e0, data=6
node 14: ptr=0x23670f0, data=5
node 15: ptr=0x2367100, data=4
node 16: ptr=0x2367110, data=5
node 17: ptr=0x2367120, data=2
node 18: ptr=0x2367130, data=1
node 19: ptr=0x2367140, data=0
node 20: ptr=0x2367150, data=5
node 21: ptr=0x2367160, data=6
node 22: ptr=0x2367170, data=5
list_SY_size, 23
list_SY_size, 23
list_size=23 
node: 0----------------------
data 0 is repeat in list_data
node: 1----------------------
data 1 is repeat in list_data
node: 2----------------------
node: 3----------------------
data 3 is not repeat in list_data
node: 4----------------------
data 4 is repeat in list_data
node: 5----------------------
data 5 is repeat in list_data
node: 6----------------------
data 6 is repeat in list_data
node: 7----------------------
data 7 is repeat in list_data
node: 8----------------------
data 8 is repeat in list_data
node: 9----------------------
data 9 is repeat in list_data
node:10----------------------
node:11----------------------
node:12----------------------
node:13----------------------
node:14----------------------
node:15----------------------
node:16----------------------
node:17----------------------
data 2 is not repeat in list_data
node:18----------------------
node:19----------------------
node:20----------------------
node:21----------------------
node:22----------------------
repeat_data[ 0] =  0
repeat_data[ 1] =  1
repeat_data[ 2] =  4
repeat_data[ 3] =  5
repeat_data[ 4] =  6
repeat_data[ 5] =  7
repeat_data[ 6] =  8
repeat_data[ 7] =  9
data---------------------repeat_num =  8

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章