//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 |
댓글