반응형
// 단순 연결 리스트
#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);
}
반응형
'2019~2020 > 자료구조' 카테고리의 다른 글
재귀 알고리즘을 사용한 이진 트리 순회 (0) | 2019.06.11 |
---|---|
n*n 배열에 저장하여 출력하기 (0) | 2019.06.05 |
swap 함수 (0) | 2019.05.21 |
포인터 제 1법칙 - 2 (0) | 2019.05.20 |
포인터 제 1 법칙 - 1 (0) | 2019.05.20 |