안뇽 프형들! 이번에는 자료구조 질문이야!
지금 그래프 파트 하고잇는데, 인접 리스트를 이용한 vertex 삽입 관련문제야!
C로 이걸 구현하면
void insert_vertex(GraphType *g, int v)
{
if ( ((g->n)+1 > MAX_VERTICES ) {
fprint(stderr, \"err\");
return;
}
g->n++;
}
이렇고,
구조체 그래프노드는 정수, 그래프노드 포인터 로 이뤄져잇고
구조체 그래프타입은 정수, 그래프노드에 대한 포인터배열 로 이뤄져잇엉!(폰으로 다 칠려니까 너무 힘들어서 안 쳣음ㅜㅠ)
어쨋든 insert vertex 함수는 정점의 수가 max_vertices 보다 크면 에러를 내고, n(int 정점의 개수) 을 1 올려주는 기능이 있는데
저기서 int v 는 아무 설명이 없긴 한데 그래프 ADT에서
insert_vertex(g,v) 가 graph g에 vertex v 를 insert 하는 연산이라, 어쨌든 c에서 구현된 것 역시 v라는 정수 이름을 가진 vertex를 만들어주고 vertex의 개수를 늘리는 것으로 이해되
여기서 궁금한건, 비록 책에서는 vertex 의 수는 순차적으로 가정한다고 했음에도 불구하고, 내가 예를 들어
그래프타입의 포인터 *g1을 만들고
Insert_vertex(g1,1) 을 30번 실행 하면
1이라는 이름을 가진 vertex를 30개 만들어내게 되는데 실질적으로 edge랑 link 되지 않았으니 아무것도 없는거라고 생각해도 될것 같아 저 int v 에 의해 생성되는 새로운 데이터는 없으니까
그럼 inser_vertex(g1,1) 을 1번만 실행해도
사실 엣지가 없으니 아무것도 없는 상태라서 위의 30번 실행한 경우랑 차이가 아예 없잖아 - g->n을 제외하면 말이지.
위의 프로그램 상 vertex 개수는 30, 밑의 vertex 개수는 1개
근데 사실상 둘 다 존재하는 vertex의 개수는 링크를 고려 안한다면 각각 1개씩으로 똑같잖아 왜냐면 첫 번째 경우, 1이라는 이름을 가진 vertex의 개수를 30개가 있다는 상황이 가능하려면 별도의 조작이 필요하니까
그럼 이 문제를 해결하려면 결국 조건이 vertex_name배열을 만들어서 함수 상에서 매개변수 int v 의 값이 기존 vertex_name 상의 하나와 같은지 다른지 검사해봐야 하는 거 아냐?
내가 뭘 놓쳐서 이러고잇는지모루겟더ㅜ
조언 환영 꾸짖음 환영!!
요점정리 : int v 에 대해, int vertex_name 배열을 따로 만들어서 이 배열의 요소들(지금까지 입력된 서로 다른 v들)과 비교를 진행해서 같은 값이 요소에 존재할 시 에러를 띄워주는 조건문이 있어야될 것 같은데 책에서는 없다! 이게 어떻게 된 뻘아이디어인지 설명해줍쇼ㅠ
소스의 일부만 올리면 제대로 된 답변을 얻기 힘들겠죠. 하지만 일반적인 구현에서는 vertex의 이름을 관리하지 않습니다. insert_vertex(GraphType *g, int v)에서 int v는 insert될 vertex의 값이라 보여집니다. 그리고 그래프에서는 vertex의 값이 당연히 중복허용이 되어야 합니다.
농부 // 전체 코드 몇 번 올렷는데 너무 길어서 사람들이 읽기 힘들어하는 것 같아서 지워버렷어여ㅎㅎ vertex의 이름을 관리하지 않는다고 해도, 인덱스 같은게 존재해야할 것 같은데(왜냐면 우리는 결국 추가된 vertex를 지목해서 값을 집어넣든 값을 변경하든 뭔가를 해야할 수도 있으니까), 결국 그 인덱스 자체가 vertex의 이름이 되는 모양인데 여기서 코드에서는 인덱스 지목을 위한 별도의 명령어가 없는걸로 봐서 int v 자체가 인덱스로 보여집니다!(지금 진도가 아직 값은 없고 vertex끼리의 연결까지만 구현한 단계에 있습니다!) 그렇다면 결국 지금 단계에서는 int v가 vertex의 이름이라고 생각할 수 있는데 이름은 같으면 안되는 것 아닌가요?ㅜ
전체소스 카피된거 있으면 다시 한번 올려보세요. 지금 소스로는 알수있는게 거의 없고요. graph클래스 안에서 vertex를 생성시킨다면 인스턴스를 배열안에 집어넣고, 이미 생성된 vertex를 graph에서 쓴다면 vertex*를 배열에 넣고 배열 인덱스를 관리하겠죠. 말씀하신대로 int v가 배열의 인덱스라면 insert_vertex라는 함수명과 어울리지 않는 파라미터라고 생각이 되네요.