link list(single)

자료구조 2015. 5. 1. 18:11

#include <stdio.h>

#include <stdlib.h>


struct _node{

int item;

struct _node* next;

};

typedef struct _node* NODE;


NODE createnode(int item);


void insert(NODE* list,NODE* tail, int item, NODE option(NODE* list, NODE* tail, NODE node) );


NODE insert_first (NODE* list, NODE* tail, NODE node);

NODE insert_last (NODE* list, NODE* tail, NODE node);

NODE insert_asc (NODE* list, NODE* tail, NODE node);

NODE insert_desc (NODE* list, NODE* tail, NODE node);

NODE insert_ith (NODE* list, NODE* tail, NODE node);


void delete_first(NODE* list,NODE* tail);

void delete_last(NODE* list, NODE* tail);

void delete_ith(NODE* list, NODE* tail);


void print_list(NODE list);



int main(void)

{

struct _node* list=NULL;

struct _node* tail=NULL;

int n,i,item;

FILE *fin=fopen("input.txt","r");




fscanf(fin,"%d",&n);

for (i=0;i<n;i++)

{

fscanf (fin,"%d",&item);

insert(&list, &tail, item, insert_desc);

}

print_list(list);


delete_first(&list,&tail);

delete_first(&list,&tail);

delete_first(&list,&tail);

delete_first(&list,&tail);

//delete_first(&list,&tail);


print_list(list);

fclose(fin);

return 0;

}

// 리스트 출력

void print_list(NODE list)

{

NODE temp=list;


while(temp!=NULL){

printf ("%d",temp->item);

temp=temp->next;}

printf ("\n");

}

// 노드만들기

NODE createnode(int item)

{

NODE temp=(NODE)malloc(sizeof(NODE*));


temp->item=item;

temp->next=NULL;


return temp;

}



// 노드추가

void insert(NODE* list,NODE* tail, int item, NODE option(NODE* list, NODE* tail, NODE node) )

{

NODE new_node=NULL;

new_node=createnode(item);


option(list,tail,new_node);

}

// 앞에

NODE insert_first(NODE* list, NODE* tail, NODE node)

{

node->next = *list;

*list=node;

return *list;

}

// 뒤에

NODE insert_last(NODE* list, NODE* tail, NODE node)

{

if ( (*list) == NULL)

{

*list=node;

*tail=node;

return *list;

}


(*tail)->next=node;

(*tail) = node;


return *list;

}

// i번째에

NODE insert_ith(NODE* list, NODE* tail, NODE node)

{

int i;

NODE prev= NULL;

NODE temp = (*list);


scanf ("%d",&i);


if ( (*list) == NULL)

{

*list=node;

*tail=node;

return *list;

}


while(temp != NULL)

{

i--;

if (i<0)

{


node->next = temp;

if (prev)

prev->next=node;


if (temp == *list)

*list=node;

//node->next = temp->next;

//temp->next = node;

break;

}

prev=temp;

temp=temp->next;

}


if (i>=0)

{

(*tail)->next=node;

(*tail) = node;

}


return *list;

}

// 오름차순

NODE insert_asc(NODE* list, NODE* tail, NODE node)

{

NODE temp=*list;

NODE prev=NULL;


if (temp == NULL)

{

*list=node;

*tail=node;


return *list;

}


while(temp !=NULL)

{

if (temp->item > node->item)

break;

prev = temp;

temp = temp->next;

}


if (temp != NULL)

node->next=temp;


if (prev != NULL)

prev->next=node;





//head, tail의 변경

if (temp == (*list))

*list = node;

if (prev == (*tail))

*tail = node;


return *list;

}

// 내림차순

NODE insert_desc(NODE* list, NODE* tail, NODE node)

{

NODE temp=*list;

NODE prev=NULL;


if (temp == NULL)

{

*list=node;

*tail=node;


return *list;

}


while(temp !=NULL)

{

if (temp->item < node->item)

break;

prev = temp;

temp = temp->next;

}


if (temp != NULL)

node->next=temp;


if (prev != NULL)

prev->next=node;





//head, tail의 변경

if (temp == (*list))

*list = node;

if (prev == (*tail))

*tail = node;


return *list;

}


void delete_first(NODE* list,NODE* tail)

{

NODE temp=*list;


*list=(*list)->next;

if (temp == *tail)

tail=NULL;


}

void delete_last(NODE* list, NODE* tail)

{

}

void delete_ith(NODE* list, NODE* tail)

{

NODE cur=*list;

NODE prev=NULL;

int i;

scanf ("%d",&i);


while(cur !=NULL)

{

if (i<=0)

{

if (prev == NULL)

{

(*list) = (*list)->next;

}

else

{

prev->next=cur->next;

}

if (cur == (*tail))

*tail=NULL;

break;

}

i--;

prev=cur;

cur=cur->next;

}


}

'자료구조' 카테고리의 다른 글

simple adjacency list  (0) 2015.05.22
hash simple linear  (0) 2015.05.22
binary search tree ( insert, kth smallest, inorder, delete by key)  (0) 2015.05.15
boolean combination  (0) 2015.05.01
Posted by rjh
,