유진 2019. 5. 28. 10:21
반응형
// 단순 연결 리스트  
#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){ //노드에 삽입 
// ** = 이중포인터- 주소의 값을 값으로 하는 연결리스트(두번 찾아감) 
// * 한개만 쓰면 밑에 함수호출에서 이상한 현상 생김 
	if(*phead == NULL){
		//연결 되지 않음  
		new_node ->link = NULL; 
		*phead=new_node; //*phead = 주소, new_mode를 *phead에 삽입 
	}
	else if(p == NULL){  
		new_node ->link = *phead; //new_node의 link를 *phead에 보관 
		*phead=new_node; ] 
	}
	else{
		new_node ->link = p->link; // p의 link를 찾아와서 연결 
		p->link=new_node;
	}
}
 
void remove_node(ListNode **phead, ListNode *p, ListNode *removed){  //노드 삭제  
  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 = 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;
	p=NULL;
	while(p!=NULL){
		r=q;
		q=p;
		p=p->link;
		q->link = r;
	}
	return q;
}
ListNode *create_node(element data, ListNode *link){ //노드 생성함수 
	ListNode *new_node; // 한칸의 노드 생성
	new_node = (ListNode *)malloc(sizeof(ListNode));
    //자료 형태는 ListNdoe, ListNode *= 강제형 변환 
	//malloc = 메모리 할당 -new_node에 ListNode만큼의 ListNode *형을 할당
    if(new_node == NULL)error("메모장 할당 에러\n");//메모리가 꽉 차서 할당 안됨
	new_node->data = data; // data 와 data 다름 
	// -> = 개체의 세부내용을 가르킴 (특수문자 아님) 
	new_node->link = link;
	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));
	dispaly(list2);
	
	list1 = concat(list1, list2);
	display(list1);
	
	list1 = reverse(list1);
	display(list1);
	
	p = search(list1, 50);
	printf("Search : %d\n", p->data);
	
}
반응형