본문 바로가기
자료구조

리스트

by chaechaekim 2019. 5. 17.
//20904 김채원 단순연결리스트 
#include<stdio.h>
#include<stdlib.h>

typedef int element;

typedef struct ListNode{
	element data;
	struct ListNode *link;
}ListNode;
 
void error(char *message){ //오류처리함수
	fprintf(stderr, "%s\n", message);
	exit(1);
}

void insert_node(ListNode **phead, ListNode *p/*null 받음*/, ListNode *new_node){ //node 삽입 함수
//**:이중 포인터 (주소의 값을 값으로 하는 연결리스트)  
	if(*phead == NULL){ //연결된게 하나도 없다  
		new_node -> link = NULL;
		*phead = new_node; //new_node 주소를 *phead에  
	}else if (p == NULL){ //뒤에 뭔가 있음  
		new_node->link = *phead; //new_node link를 *phead에 연결  
		*phead = new_node; //*phead는 다시 new_node랑 연결  
	}else{
		new_node -> link = p->link; //new_node link를 p로 따라가서 찾아감 
		p->link = new_node;
	}
}

void remove_node(ListNode **phead, ListNode *p, ListNode *removed){ //node 삭제 함수  
	if(p == NULL)
		*phead = (*phead)->link;
	else
		p->link=removed->link;
	free(removed);
}
 
void display(ListNode *head){ //리스트 출력 함수 
	ListNode *p=head; 
	while(p!=NULL){ //null이 나올때까지 따라가서 반복 
		printf("%d->", p->data); //p라는 곳의 data 출력  
		p = p->link; 
	}
	printf("\n");
}
  
ListNode *search(ListNode *head, int x){ //리스트탐색함수
	ListNode *p;
	p = head;
	while(p!=NULL){
		if(p->data == x) return p;
		p = p->link;
	}
	return p;
}

ListNode *concat(ListNode *head1, ListNode *head2){ //리스트 합병 함수 
	ListNode *p;
	if(head1 == NULL) return head2;
	else if(head2 == NULL) return head1;
	else{
		p = head1;
		while(p->link!=NULL){
			p = p->link;
		}
		p->link = head2;
		return head1;
	}
}
 
ListNode *reverse(ListNode *head){ //리스트 역함수 
	ListNode *p, *q, *r;
	p = head;
	q = NULL;
	while(p!=NULL){
		r = q;
		q = p;
		p = p->link;
		q->link = r;
	}
	return q;
}
 
ListNode *create_node(element data, ListNode *link){ //node 생성 함수 
	ListNode *new_node;
	new_node = (ListNode *)malloc(sizeof(ListNode));
	//melloc:메모리 할당 (ListNode *): 강제형변환  
	if(new_node == NULL) error("메모리할당 에러\n");
	new_node->data = data; //-:개체세부내용 가리킴(특수문자x) (=*new_node.data)
	new_node->link = link; //null 
	return new_node;  
}

int main()
{
	ListNode *list1 = NULL, *list2 = NULL;
	ListNode *p;
	
	insert_node(&list1, NULL, create_node(10, NULL));
	insert_node(&list1, NULL, create_node(20, NULL));
	insert_node(&list1, NULL, create_node(30, NULL));
	display(list1);
	
	remove_node(&list1, NULL, list1);
	
	display(list1);
	
	insert_node(&list2, NULL, create_node(40, NULL));
	insert_node(&list2, NULL, create_node(50, NULL));
	insert_node(&list2, NULL, create_node(60, NULL));
	display(list2);
	
	list1 = concat(list1, list2);
	display(list1);
	
	list1 = reverse(list1);
	display(list1);
	
	p = search(list1, 50);
	printf("Search : %d\n", p->data);
}

/*
30->20->10->
20->10->
60->50->40->
20->10->60->50->40->
Search : 50

--------------------------------
Process exited after 0.02109 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .
*/

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

포인터 실습 2 toOne.c  (0) 2019.05.20
포인터 실습 1  (0) 2019.05.17
  (0) 2019.05.14
Stack push pop peek  (0) 2019.04.09
함수 사용  (0) 2019.04.08

댓글