Linked List

minkong·2024년 4월 14일
0

index * 데이터타입 크기
고정된 크기
연속된 메모리 할당은 불편함

단점
1. 공간 효율성이 떨어짐
2. 차곡차곡성을 지키기 위해 많은 계산이 필요함
3. dynamic한 data를 다루기에 한계가 있음

장점
1. ramdomly access //memory access에 uniform함
2.

malloc으로 공간을 dynamic하게 잡을 수있지만 index는 포인터(한정적인 문제)
-> 포인터를 실시간으로 만들자

인덱스 + 담을 공간 + 포인터 1개 생성(다음 것을 가리키는)
-> data 만드는 개수만큼 포인터 생성
데이터를 새로 받는 만큼 포인터를 생성해서 다음 데이터를 받는 ..
동적으로

Linked List
장점
1. 가변적으로 확대하거나 축소할 수 있음
2. 추가/삭제가 용이 연결 관계만 바꾸면 됌 비용이 쌈

단점
1. array는 geometric하게 가능하지만 linked list는 연결관계 순으로 접근해야 함(상보적 관계)
2. 순서 관계가 헷갈림? (dellema)
3.

-> 사용자는 개발 특성에 따라 적절한 List 사용

single Linked List, array list의 살짝 변형
연결관계에 Link -> 다음 array
출발점을 별도의 variable에 저장
한계점: capacity만큼 꽉 잡고 있어서 늘리거나 그런거 ㄴ

code/Apr12/arrlist.c

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

typedef
struct {
int arrlen ;
int size ;
int first ;
char * data ;
int
link ;
}
arrlist_t ;

arrlist_t * create_arrlist (int capacity)
{
if (capacity <= 0) {
return NULL ;
}

arrlist_t * l = (arrlist_t *) malloc(sizeof(arrlist_t)) ;
if (l == NULL) {
	return NULL ;
}
l->arrlen = capacity + 1 ;	// +1 ? 0번 index를 null 값으로 
l->size = 0 ;
l->first = 0 ;
l->data = (char **) calloc(l->arrlen, sizeof(char *)) ;
l->link = (int *) calloc(l->arrlen, sizeof(int)) ;
memset(l->link, 0, l->arrlen * sizeof(int)) ; 
if (l->data == NULL || l->link == NULL) {
	free(l) ;
	return NULL ;
}

return l ; 

}

int insert_arrlist (arrlist_t l, char s)
{
if (s == NULL)
return 0 ;

if (l->size == l->arrlen - 1)
	return 0 ;

int next = 1 ;
while (l->data[next] != NULL) {
	next++ ;
}
l->data[next] = s ;
l->link[next] = 0 ;

/* TODO */

l->size++ ;

return 1 ;

}

char delete_arrlist (arrlist_t l, char * s)
{
if (l->size == 0)
return NULL ;

int i, prev ;

/* TODO */

char * r = l->data[i] ;
l->data[i] = NULL ;

if (prev == 0) {
	l->first = l->link[i] ;
}
else {
	l->link[prev] = l->link[i] ;
}

return r ;

}

void print_arrlist (arrlist_t * l)
{
int i ;
for (i = l->first ; i != 0 ; i = l->link[i]) {
printf("%s ", l->data[i]) ;
}
printf("\n") ;
}

void free_arrlist (arrlist_t * l)
{
free(l->data) ;
free(l->link) ;
free(l) ;
}

int main () //string 입력을 받음, string표현하는 포인터를 저장
{
arrlist_t * l = create_arrlist(30) ;

insert_arrlist(l, "BAT") ;
insert_arrlist(l, "CAT") ;
insert_arrlist(l, "EAT") ;
insert_arrlist(l, "FAT") ;
insert_arrlist(l, "GAT") ;
insert_arrlist(l, "HAT") ;
insert_arrlist(l, "VAT") ;
insert_arrlist(l, "WAT") ;

delete_arrlist(l, "FAT") ;
delete_arrlist(l, "VAT") ;

print_arrlist(l) ;

free_arrlist(l) ;

return EXIT_SUCCESS ;

}

code/Apr12/arrlist.c

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

typedef
struct {
int arrlen ;
int size ;
int first ;
char * data ;
int
link ;
}
arrlist_t ;

arrlist_t * create_arrlist (int capacity)
{
if (capacity <= 0) {
return NULL ;
}

arrlist_t * l = (arrlist_t *) malloc(sizeof(arrlist_t)) ;
if (l == NULL) {
	return NULL ;
}
l->arrlen = capacity + 1 ;
l->size = 0 ;
l->first = 0 ;
l->data = (char **) calloc(l->arrlen, sizeof(char *)) ;
l->link = (int *) calloc(l->arrlen, sizeof(int)) ;
memset(l->data, 0, ----)
memset(l->link, 0, l->arrlen * sizeof(int)) ; 
if (l->data == NULL || l->link == NULL) {
	free(l) ;
	return NULL ;
}

return l ; 

}

int insert_arrlist (arrlist_t l, char s)
{
if (s == NULL)
return 0 ;

if (l->size == l->arrlen - 1)	// size가 꽉 차서 못받음 
	return 0 ;

// allocate 


int next = 1 ;
while (l->data[next] != NULL) {	//새로 넣을 위치
	next++ ;	
}
l->data[next] = s ;
l->link[next] = 0 ;	//다음이 없는 -> 링크 값 0으로 표현

/* TODO: link 마지막 애랑 연결시켜주는 */
if (l-> first == 0){
	l->first = next;
}
else{
	//int i;
    //for (i =. ->fisrst; l->link[i] !=0; i= l->link[i]);
    
    i = l->first;
    while(l-> link[i] !=0){
    	i= l-> link[i]
        }
        // l->link[0] ==0, while의 의도
        l-> link[i] = next //후임이 생겼다 개념 
    
}

l->size++ ;

return 1 ;

}

char delete_arrlist (arrlist_t l, char * s)
{
if (l->size == 0)
return NULL ;

int i, prev ; 	//i는 빼야되는 인덱스, prev는 그것의 앞에꺼 
/* TODO */
//i는 first로 시작, s= string이 같을 때 까지 반복
prev =0;
i = l->first;
while(i != 0){
	if}
while(*s != data[i]){
	
}

char * r = l->data[i] ;
l->data[i] = NULL ;

if (prev == 0) {	//뺄게없다, first인 경우-> prev가 없음
	l->first = l->link[i] ;
}
else {
	l->link[prev] = l->link[i] ;
}

return r ;

}

void print_arrlist (arrlist_t * l)
{
int i ;
for (i = l->first ; i != 0 ; i = l->link[i]) {
printf("%s ", l->data[i]) ;
}
printf("\n") ;
}

void free_arrlist (arrlist_t * l)
{
free(l->data) ;
free(l->link) ;
free(l) ;
}

int main ()
{
arrlist_t * l = create_arrlist(30) ;

insert_arrlist(l, "BAT") ;
insert_arrlist(l, "CAT") ;
insert_arrlist(l, "EAT") ;
insert_arrlist(l, "FAT") ;
insert_arrlist(l, "GAT") ;
insert_arrlist(l, "HAT") ;
insert_arrlist(l, "VAT") ;
insert_arrlist(l, "WAT") ;

delete_arrlist(l, "FAT") ;
delete_arrlist(l, "VAT") ;

print_arrlist(l) ;

free_arrlist(l) ;

return EXIT_SUCCESS ;

}

0개의 댓글