Untitled
Never
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef struct DLlistNode { int data; struct DLlistNode* llink; struct DLlistNode* rlink; } DLlistNode; typedef struct DLlistType { DLlistNode* head; } DLlistType; int get_length(DLlistType* dlist); void insert_node_pos(DLlistType* dlist, int pos, int data); void insert_list_pos(DLlistType* dlist1, DLlistType* dlist2, int pos); DLlistNode* cut_list_pos(DLlistType* dlist, int pos1, int pos2); void modification(DLlistType* dlist, int pos, int data); void copy_list(DLlistType* dlist1, DLlistType* dlist2); void init(DLlistType* dq) { dq->head = NULL; } int is_empty(DLlistType* dlist) { if (dlist->head == NULL) return TRUE; else return FALSE; } void display(DLlistType* dlist) { DLlistNode* tmp = NULL; for (tmp = dlist->head; tmp != NULL; tmp = tmp->rlink) { printf("%d -> ", tmp->data); } printf("\n"); } DLlistNode* create_node(DLlistNode* llink, int data, DLlistNode* rlink) { DLlistNode* new_node; new_node = (DLlistNode*)malloc(sizeof(DLlistNode)); if (new_node == NULL) { printf("%s\n", "메모리 할당 오류"); exit(1); // 메모리 오류가 발생하면 프로그램 종료 } else { new_node->data = data; new_node->llink = llink; new_node->rlink = rlink; } return new_node; } ///////////////////////////////// 구현 함수 ////////////////////////////////////// int get_length(DLlistType* dlist) { int cnt=0; // DLlistNode의 개수를 담을 변수 생성 DLlistNode* cur = dlist->head; // cur가 dlist->head를 가리키도록 설정 while(cur != NULL) { // cur가 오른쪽 끝까지 이동할 때 까지 반복 cnt++; // 개수를 늘려줌 cur = cur->rlink; // cur를 오른쪽으로 한칸 이동. } return cnt; // 세어준 개수를 리턴 } ///////////////////////////////// 구현 함수 ////////////////////////////////////// void insert_node_pos(DLlistType* dlist, int pos, int data) { int len = get_length(dlist); // dlist의 개수를 저장 if(pos > len+1 || pos<=0 ){ // pos가 나올 수 없는 값일 때 printf("position 오류: position은 %d ~ %d 선택\n", 1, len+1); // 에러 출력 return; // 함수 종료 } DLlistNode** cur = &(dlist->head); // cur는 dlist->head를 의미함. if(is_empty(dlist)) { // dlist가 비어있을 때 *cur = create_node(NULL, data, NULL); // head에 새로운 노드를 만들어줌 return; // 함수 종료 } if(pos==1){ // head에 새로운 값을 넣어야 할 때 DLlistNode *newNode = create_node((*cur)->llink, data, *cur); // 새로운 노드를 만들어서 주소값을 newNode에 대입. cur의 왼쪽과 cur 사이에 들어감 (*cur)->llink=newNode; // 현재 위치(head)의 왼쪽에 새로운 노드를 넣어줌. } else if(pos==len+1){ while((*cur)->rlink!=NULL) *cur=(*cur)->rlink; // cur를 가장 오른쪽으로 이동. DLlistNode *newNode = create_node(*cur, data, NULL); // 새로운 노드를 만들어서 주소값을 newNode에 대입. cur 오른쪽에 들어감. (*cur)->rlink=newNode; // 현재 위치(오른쪽 끝)의 오른쪽에 새로운 노드를 넣어줌. } else{ for(int i=1; i<pos; ++i) *cur = (*cur)->rlink; // 삽입할 위치까지 cur를 오른쪽으로 이동. DLlistNode *newNode = create_node((*cur)->llink, data, *cur); // 새로운 노드를 만들어서 주소값을 noewNode에 대입. cur의 왼쪽과 cur 사이에 들어감. (*cur)->llink->rlink=newNode; // cur의 왼쪽에 있는 노드 기준에서 오른쪽에 새로운 노드가 와야 함. (*cur)->llink=newNode; // cur 기준에서 왼쪽에 새로운 노드가 와야 함. } while((*cur)->llink!=NULL) (*cur)=(*cur)->llink; // head가 가장 처음으로 오도록 원위치. } ///////////////////////////////// 구현 함수 ////////////////////////////////////// void insert_list_pos(DLlistType* dlist1, DLlistType* dlist2, int pos) { int len1=get_length(dlist1); // dlist1의 길이 저장 int len2=get_length(dlist2); // dlist2의 길이 저장 if(len2 == 0) return; // dlist2가 비었으면 함수 종료. if(pos > len1+1 || pos<=0){ // pos가 올 수 없는 위치라면 printf("position 오류: position은 %d ~ %d 선택\n", 1, len1+1); // 오류 메세지 출력 return; // 함수 종료 } DLlistNode **cur = &dlist1->head; // cur는 dlist1->head를 의미함. DLlistNode **cur2 = &dlist2->head; // cur2는 dlist2->head를 의미함. if(*cur==NULL) { // dlist1이 빈 리스트라면 *cur = dlist2->head; // dlist2를 삽입 return; // 함수 종료 } if(pos==1){ // head에 바로 넣는 것이라면 while((*cur2)->rlink!=NULL) *cur2=(*cur2)->rlink; // 먼저 cur2를 가장 오른쪽으로 이동. (*cur2)->rlink=*cur; // cur2의 오른쪽에 cur, 즉 dlist1->head를 넣어줌. (*cur)->llink=*cur2; // cur의 왼쪽에 cur2가 있어야 함. *cur2 = NULL; // cur2의 연결 요소 해제 while((*cur)->llink!=NULL) *cur=(*cur)->llink; // cur이 head가 되도록 원위치. } else if(pos==len1+1){ // 가장 마지막에 넣는 것 이라면 while((*cur)->rlink!=NULL) *cur=(*cur)->rlink; // 먼저 cur를 가장 오른쪽으로 이동 (*cur)->rlink=(*cur2); // cur의 오른쪽에 cur2를 넣어줌. (*cur2)->llink=(*cur); // cur2의 왼쪽에 cur를 넣어줌. *cur2 = NULL; // cur2의 연결 요소 해제 while((*cur)->llink!=NULL) *cur=(*cur)->llink; // cur이 head가 되도록 원위치 } else{ for(int i=1; i<pos-1; ++i) *cur=(*cur)->rlink; // 원하는 위치까지 cur를 오른쪽으로 한칸씩 이동 while((*cur2)->rlink!=NULL) *cur2=(*cur2)->rlink; // cur2는 가장 오른쪽으로 이동. (*cur2)->rlink=(*cur)->rlink; // cur2의 오른쪽에 cur의 오른쪽 노드가 와야 함. (*cur)->rlink->llink=*cur2; // cur의 오른쪽 노드의 왼쪽에 cur2가 와야 함. while((*cur2)->llink!=NULL) *cur2=(*cur2)->llink; // cur2를 왼쪽 끝으로 (기존 dlist2->head)로 이동. (*cur)->rlink=*cur2; // cur의 오른쪽에 cur2가 와야 함. (*cur2)->llink=*cur; // cur2의 왼쪽에 cur이 와야 함. *cur2=NULL; // cur2의 연결 요소 해제 while((*cur)->llink!=NULL) *cur=(*cur)->llink; // cur이 head가 되도록 원위치. } } ///////////////////////////////// 구현 함수 ////////////////////////////////////// DLlistNode* cut_list_pos(DLlistType* dlist, int pos1, int pos2) { DLlistNode *l,*r; // l은 pos1에 위치한 노드를, r은 pos2에 위치한 노드를 담을 예정. int len = get_length(dlist); // dlist의 길이 저장. DLlistNode **cur = &dlist->head; // cur는 dlist->head를 의미함. if(cur==NULL) { // dlist가 비어있었다면 printf("공백 삭제 오류\n"); // 오류 메세지 출력 return NULL; // 함수 종료 } if(pos1>pos2 || pos2 > len){ // 있을 수 없는 위치가 들어왔다면 printf("position 오류: 1 <= position1 <= position2 <= %d 에서 선택\n", len); // 오류 메세지 출력 return NULL; // 함수 종료 } DLlistNode *ret; // 리턴할 리스트의 가장 첫 노드를 가리킬 예정. if(len==1){ // dlist에 노드가 1개 있다면 ret=*cur; // ret에 cur를 담고 *cur=NULL; // cur의 연결요소해제 return ret; // ret 리턴 } for(int i=1; i<=pos2; ++i){ // 1부터 pos2까지 반복 if(i==pos1){ // pos1에 해당하는 노드를 만나면 l=*cur; // l에 대입 } if(i==pos2){ // pos2에 해당하는 노드를 만나면 r=*cur; // r에 대입 } if((*cur)->rlink!=NULL) *cur=(*cur)->rlink; // cur를 오른쪽으로 하나씩 이동 } while((*cur)->llink!=NULL) *cur=(*cur)->llink; // cur를 다시 head로 원위치 if(l->llink==NULL){ // l이 head라면 while(*cur!=r) *cur=(*cur)->rlink; // cur를 r까지 옮김. *cur=(*cur)->rlink; // cur가 r의 바로 오른쪽에 오도록 이동. r->rlink=NULL; // r에서 cur로 가는 길을 막음. (*cur)->llink=NULL; // cur에서 r로 가는 길을 막음. ret=l; // ret에 l 대입 } else{ // l이 head가 아니라면 while(*cur != l) *cur=(*cur)->rlink; // cur이 l이 될 때까지 오른쪽으로 이동 (*cur)->rlink=r->rlink; // cur의 오른쪽에 r의 오른쪽에 있던 노드가 오도록 함. if((*cur)->rlink!=NULL) (*cur)->rlink->llink=*cur; // cur이 마지막 노드가 아니라면 cur의 오른쪽 노드 기준 왼쪽 노드는 cur이 되도록 함. l->llink=NULL; // l과 기존 리스트의 연결 요소 해제 r->rlink=NULL; // r과 기존 리스트의 연결 요소 해제 ret=l; // ret에 l 대입 } while((*cur)->llink!=NULL) *cur=(*cur)->llink; // cur이 head에 오도록 원위치 return ret; // ret 리턴 } ///////////////////////////////// 구현 함수 ////////////////////////////////////// void modification(DLlistType* dlist, int pos, int data) { DLlistNode *cur = dlist->head; // cur이 dlist->head를 가리킴. if(cur==NULL){ // dlist가 비어있을 때 printf("공백 수정 오류\n"); // 오류 메세지 출력 return; // 함수 종료 } int len = get_length(dlist); // dlist의 길이 저장 if(pos > len || pos<=0){ // pos 값이 올바르지 않을 때 printf("position 오류: position은 %d ~ %d 에서 선택\n", 1, len); // 오류 메세지 출력 return; // 함수 종료 } for(int i=1; i<pos; ++i) cur=cur->rlink; // 원하는 위치까지 cur를 오른쪽으로 이동 cur->data=data; // 원하는 위치의 노드의 data를 원하는 data로 수정 } ///////////////////////////////// 구현 함수 ////////////////////////////////////// void copy_list(DLlistType* dlist1, DLlistType* dlist2) { DLlistNode **cur = &dlist1->head; // cur은 dlist1->head를 의미함. DLlistNode **cur2 = &dlist2->head; // cur2는 dlist2->head를 의미함. DLlistNode *newNode = create_node(NULL, (*cur2)->data, NULL); // cur2의 데이터를 가진 새로운 노드를 생성. (*cur)=newNode; // cur에 새로운 노드를 넣어줌. while((*cur2)->rlink!=NULL){ // cur2가 오른쪽 끝에 도달할 때 까지 (*cur2)=(*cur2)->rlink; // cur2를 먼저 오른쪽으로 하나 이동 (*cur)->rlink = create_node((*cur), (*cur2)->data, NULL); // cur2의 데이터를 가진 새로운 노드를 생성 후 cur의 오른쪽에 넣어줌. (*cur)->rlink->llink=*cur; // 방금 추가한 노드의 왼쪽은 cur이 되어야 함. *cur=(*cur)->rlink; // cur도 오른쪽으로 하나 이동 } while((*cur)->llink!=NULL) (*cur)=(*cur)->llink; // cur을 head로 원위치 while((*cur2)->llink!=NULL) (*cur2)=(*cur2)->llink; // cur2를 head로 원위치 } int main() { DLlistType dList1, dList2; DLlistNode* removed_node = NULL; int len, i; init(&dList1); init(&dList2); printf("insert_node_pos(): \n"); insert_node_pos(&dList1, 1, 90); insert_node_pos(&dList1, 1, 20); insert_node_pos(&dList1, 1, 10); printf("dList1 : "); display(&dList1); printf("\n"); printf("copy_list(): \n"); copy_list(&dList2, &dList1); printf("dList2 : "); display(&dList2); printf("\n"); printf("modification(): \n"); modification(&dList2, 1, 30); modification(&dList2, 2, 40); modification(&dList2, 3, 50); printf("dList2 : "); display(&dList2); printf("\n"); printf("insert_list_pos(): \n"); insert_list_pos(&dList1, &dList2, 3); printf("dList1 : "); display(&dList1); printf("\n"); len = get_length(&dList1); printf("dList1 length by get_length(): %d \n\n", len); printf("cut_list_pos(): \n"); for (i = 1; i<= len; i++) { removed_node = cut_list_pos(&dList1, 1, 1); printf("node %d data : %d \n\n",i, removed_node->data); free(removed_node); } return 0; }
Raw Text
-
Just chill and fuck at home
19 min ago
-
SaaSCloud
39 min ago
-
Cazafantasmas: Imperio helado online pelicula completa
45 min ago
-
rse54b svcbjk
47 min ago
-
Makers CBD Gummies
47 min ago
-
Late Night Sex Creampie
49 min ago
-
bbka
52 min ago
-
Untitled
56 min ago
-
Dalawang Beses Nilabasan at Pinutukan ng Tamod sa Bibig si MsLady!
1 hour ago
-
Adult Telegram Channels
1 hour ago