정성훈
    테스트 중



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define TRUE 1
#define FALSE 0

typedef int element;
typedef struct ListNode {
 element data;
 struct ListNode *link;
} ListNode;

typedef struct {
 ListNode *head;   // 헤드 포인터
 int length;  // 노드의 개수
} ListType;

void init(ListType *list)
{
 list->head = NULL;
 list->length = 0;
}

ListType list1;

void insert_node(ListNode **phead, ListNode *p, ListNode *new_node)
{
 if (*phead == NULL) { // 공백리스트인 경우
  new_node->link = NULL;
  *phead = new_node;
 }
 else if (p == NULL) { // p가 NULL이면 첫번째 노드로 삽입
  new_node->link = *phead;
  *phead = new_node;
 }
 else {    // p 다음에 삽입
  new_node->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 insert_first(ListNode **phead, ListNode *node)
{
 if (*phead == NULL) {
  *phead = node;
  node->link = node;
 }
 else {
  node->link = (*phead)->link;
  (*phead)->link = node;
  *phead = node;
 }
}

void insert_last(ListNode **phead, ListNode *node)
{
 if (*phead == NULL) {
  *phead = node;
  node->link = node;
 }
 else {
  node->link = (*phead)->link;
  (*phead)->link = node;
  
 }
}

void error(char *str)
{
 printf("%s\n", str);
 exit(1);
}

int is_empty(ListType *list)
{
 if (list->head == NULL) return 1;
 else return 0;
}

int get_length(ListType *list)
{
 return list->length;
}

ListNode *get_node_at(ListType *list, int pos)
{
 int i;
 ListNode *tmp_node = list->head;
 if (pos < 0) return NULL;
 for (i = 0; i < pos; i++)
  tmp_node = tmp_node->link;
 return tmp_node;
}
// 주어진 위치에 데이터를 삽입한다.
void add(ListType *list, int position, element data)
{
 ListNode *p;
 if ((position >= 0) && (position <= list->length)) {
  ListNode*node = (ListNode *)malloc(sizeof(ListNode));
  if (node == NULL) error("메모리 할당에러");
  node->data = data;
  p = get_node_at(list, position - 1);
  insert_node(&(list->head), p, node);
  list->length++;
 }
}
void delete(ListType *list, int pos)
{
 if (!is_empty(list) && (pos >= 0) && (pos < list->length)) {
  ListNode *p = get_node_at(list, pos - 1);
  remove_node(&(list->head), p, (p != NULL) ? p->link : NULL);
  list->length--;
 }
}

element get_entry(ListType *list, int pos)
{
 ListNode *p;
 if (pos >= list->length) error("위치 오류");
 p = get_node_at(list, pos);
 return p->data;
}

void display(ListType *list)
{
 int i;
 ListNode *node = list->head;
 printf("( ");
 for (i = 0; i < list->length; i++) {
  printf("%d ", node->data);
  node = node->link;
 }
 printf(" )\n");
}

int is_in_list(ListType *list, element item)
{
 ListNode *p;
 p = list->head;  // 헤드 포인터에서부터 시작한다.
 while ((p != NULL)) {
  // 노드의 데이터가 item이면
  if (p->data == item)
   break;
  p = p->link;
 }
 if (p == NULL) return FALSE;
 else return TRUE;
}
void add_last(ListType *list, element data)
{
 ListNode *newnode;
 newnode = (ListNode *)malloc(sizeof(ListNode));
 newnode->data = data;
 if (newnode == (ListNode *)NULL) error("메모리 오류");
 insert_last(&(list->head), newnode);
 list->length++;
}
void add_first(ListType *list, element data)
{
 ListNode *newnode;
 newnode = (ListNode *)malloc(sizeof(ListNode));
 newnode->data = data;
 if (newnode == (ListNode *)NULL) error("메모리 오류");
 insert_first(&(list->head), newnode);
 list->length++;
}
int main()
{
 ListType list1;
 init(&list1);
 add(&list1, 0, 20);
 add_last(&list1, 30);
 printf("here:\n");
 display(&list1);
 add_first(&list1, 10);
 add_last(&list1, 40);
 // list1 = (10, 20, 30, 40)
 display(&list1);
 // list1 = (10, 20, 30)
 delete(&list1, 3);
 display(&list1);
 // list1 = (20, 30)
 delete(&list1, 0);
 display(&list1);
 printf("%s\n", is_in_list(&list1, 20) == TRUE ? "성공" : "실패");
 printf("%d\n", get_entry(&list1, 0));
}

  등록일 : 2018-11-08 [19:17] 조회 : 1714 다운 : 0   
 
△ 이전글교재 프로그램 참고 다운로드 안될 때
▽ 다음글(예비 1) 문자열 처리 함수
자료구조 실습게시판
번호 제 목 이름 조회 등록일
교재 프로그램 참고 다운로드 안될 때
68 (임시) 이중 포인터의 이해 실습 정성훈 291 11-21
67 (임시) 단순연결 리스트 insert_node 집중 분석 실습 정성훈 394 11-21
66 교재 프로그램 참고 다운로드 안될 때 실습 정성훈 747 10-03
65 테스트 중 실습 정성훈 1714 11-08
64 (예비 1) 문자열 처리 함수 실습 정성훈 2719 05-14
63 └❶ 힌트1 - strlen 구현 예) 계속 정성훈 1996 06-05
62 └❶ l실습 프로그램 예) 비공개 계속 정성훈 170 05-14
61 (실습 12) 로또 조합 생성기 실습 정성훈 3267 05-26
60 └❶ 실습 프로그램 예) 비공개 계속 정성훈 94 05-26
59 (실습 11) 시뮬레이션 실습 정성훈 8882 05-23
58 └❶ 추가 1)의 결과화면 예 계속 정성훈 1866 06-03
57    └❷ 추가 2)의 결과화면 예 계속 정성훈 1681 06-03
56 └❶ 실습 프로그램 예) 비공개 계속 정성훈 303 05-23
55    └❷ 실습 프로그램 예2) 비공개 계속 정성훈 147 06-03
54 (실습 10) 미로찾기 실습 정성훈 5593 05-15

[1][2][3][4][5]