코딩 잘 못하는 전자과인데 이번학기에 데이터구조 들으면서 힘듬 ㅠㅠ
질문이 이거고 밑에 k번째 삽입,삭제 하는 큐에대한 소스를 짜봤거든 혼자?
main에서 addq가 실행되면 중단되네 프로그램이 이거 왜그런거야?
이렇게 하는게 맞을까 그리고?
답변부탁해 고수형들 ㅠㅠ
2. We can maintain a linear list circularly in an array, circle[MAX_SIZE]. We set up front and rear indices similar to those used for a circular queue.
(a) Obtain a formula in terms of front, rear, and MAX_SIZE for the number of elements in the list.
(b) Write a function that deletes the k-th element in the list.
(c) Write a function that inserts an element, item, immediately after the k-th element.
(d) What is the time complexity of your functions for (b) and (c)?
#include <stdio.h>
#define MAX_QUEUE_SIZE 100
#define EXIT_FAILURE -1
typedef struct {
int key;
}element; //구조체 선언
element queue[MAX_QUEUE_SIZE]; // 크기가 MAX_QUEUE_SIZE인 구조체 배열 'queue' 선언
int rear = MAX_QUEUE_SIZE - 10; // rear값 설정
int front = 0; // front값 설정
void addq(int front, int *prear, element item, int k)
{
int i = 0;
*prear = (*prear + 1) % MAX_QUEUE_SIZE; // prear 전진
if (front == *prear) //전진한 prear가 front와 같을경우
printf("queue is full"); // queue = full
else if (k < *prear && k> front) { // 그게아닐경우 k 가 front와 rear 사이의 수 라면
for (i = *prear; i > k - 1; i--) // k+1번째부터 rear까지 element들을 전부 한칸씩 이동
queue[i] = queue[i - 1];
queue[k - 1] = item; // k번째 배열에 item 삽입
}
}
element deleteq(int *pfront, int rear, int k)
{
int i = 0;
element item;
element temp;
if (*pfront == rear) // front == rear 이면 empty
return;
else if (k < rear && k> *pfront) {
temp = queue[k - 1]; // temp에 k번째 원소값 저장
for (i = k-1; i > *pfront; i--) // front부터 k번째까지 데이터값들을 전진
queue[i] = queue[i - 1];
*pfront = (*pfront + 1) % MAX_QUEUE_SIZE; // *pfront를 한칸 전진
}
return temp; // 원래 k번째 요소를 리턴
}
void main() {
int j = 0;
int k = 0;
element item;
for (j = front; j < rear; j++)
queue[j].key = j; // queue배열에 값 저장.
for (j = front; j < rear; j++)
printf("queue[%d] = %d ", j, queue[j]); // 배열에 저장된 값들을 표시
printf("삽입할 위치인 k를 입력하세요. ");
scanf("%d", &k); //삽입할 위치 입력
printf("k에 입력할 값을 입력하세요 ");
scanf("%d", &item); //삽입할 위치에 삽입할 수 입력
addq(front, rear, item, k);
printf("삽인된 요소는 %th element = item 입니다.", &k, &item);
for (j = front; j < rear; j++)
printf("queue[%d] = %d ", j, queue[j]); //삽입이 된 후 배열 출력.
printf("삭제할 위치인 k를 입력하세요. ");
scanf("%d", &k); //삭제할 위치 k 입력.
item = deleteq(front, rear, k);
printf("삭제된 요소는 %dth element = item 입니다.", &k, &item);
for (j = front; j < rear; j++)
printf("queue[%d] = %d ", j, queue[j]); //삭제한 후 배열 출력
}
야 근데 니 같으면 남이 쓴 코드 인덴트도 안되고 syntax highlighting도 없는걸 한 줄 한 줄 읽고 있겠냐? 진심으로 궁금 ㅇㅇ
add할때 원소들 왜 다 옮겨주냐... rear가 0이면 else에서 queue -1참조 되니까 런타임 에러 뱉는거 아닌가 - 민소하게! 더 민소민소하게!!
ㄴ 와 여기 코딩 요정 등장
윗 댓글 말이 맞아 개념글에 코드 올리는법 있으니까 수정하고 댓글달았는데 지우지는.말아줘 - 민소하게! 더 민소민소하게!!
형들진짜 미안해 내가 잘 모르는데 질문할데가 도저히없는거 , ㅠㅠㅠㅠ 아는데라곤 디씨밖에없어서 질문해봤는데 그래서 주석 열심히달았거든 ... 나같아도 남이 한거 잘 안읽겠지만 답변해주는형들 고마움 ㅠ
그래 ㅋㅋㅋ 일단 그 옮기는거는 왜하는지 설명좀 해줄래? - 민소하게! 더 민소민소하게!!
내 생각엔 k번째에 원소를 넣으려고하면 뒤에 k+1번째부터 뒤까지 data movement가 일어나야하지않나 해서
원래 원형큐에 삽입할때 리어를 옮기고 if문으로 검사하고 rear값에 item을 넣잖아 삭제할땐 front를 전진시키고 그전의값을 return하고, 근데 k번째 삽입,삭제할땐 데이터를 옮겨서 그 빈공간인곳에 원소를 넣어야하는게 아닌가 해서 그랬어
유동아 큐는 삽입연산 위치가 정해저 있어 사용자가 임의로 지정하는게 아니야 - 민소하게! 더 민소민소하게!!
아 문제 b에 있네 - 민소하게! 더 민소민소하게!!
그럼 문제에서처럼 2,3번을 구현하려면 어떻게 해야해?
그냥 큐에서 똥구멍이 대가리 가리키게 하면 원형큐 아님?
맞네 그래도 저러면 -1에 참조가 일어나니까 그냥 큐 한개 만들어놓고 front에서 k까지 enqueue해놓고 거기에 item넣고 나머지 원소들 새로만든 큐에 넣으면 새로운큐에 k번째에 원소 들어감 - 민소하게! 더 민소민소하게!!
그러니까 큐 한개더 만들어서 1 k까지 원소 넣는다 2item넣는다 3나머지 원소 넣는다. 그러면 새 큐에 결과 나옴 그거 다시 원래꺼에 옮겨도 되고 - 민소하게! 더 민소민소하게!!
시간복잡도는 원래 큐에 n개있었으면 O (n)임 - 민소하게! 더 민소민소하게!!
아아 그럼 내 아이디어는 맞는거야? data movement가 있어야하는거지? 최악의경우는 첫번째에 삽입을해야하니까 리스트의 크기만큼일테고 ? 수정해볼게 조언고마워! 혹시 염치없지만 나 수정하고나서 첨삭좀 도와줄 수 있어?? ㅠㅠ 카톡아이디좀 알려주면 땡큐 ㅠ
data는 냅두고 front ,rear index만 이동시키는거 아닌가
이 디시 아이디는 카톡디 못깜 ㅈㅅ ㅋㅋㅋ 그냥 프갤이나 옂갤에서 나 찾아라 갤로그.방명록 이용하거나 - 민소하게! 더 민소민소하게!!
고마워 아이디어는 맞다는거지? 걍 큐 하나 더 만들어서 복사한담에 다시 붙혀? , 근데 위에 122유동 front rear index이동만으로 k번째에 아이템을 넣는걸 구현할 수 있어?
front rear는 enqueue dequeue연산 그리고 엠티 풀 확인 용으로 써야함 그리고 데이터 무조껀 밀어야 함 - 민소하게! 더 민소민소하게!!
궁금한거 있으면 방명록 여장갤 프갤 나 찾으셈 - 민소하게! 더 민소민소하게!!