c언어로 덱을 구현해봤는데 오류가많이납니다...좀길지만 봐주시면 감사하겠습니다.
글쓴이: uyyhgdd / 작성시간: 수, 2015/05/20 - 8:33오후
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct{ int key; char name[10]; char grade; }element; typedef struct doubleListNode{ element data; struct doubleListNode *rlink; struct doubleListNode *llink; }deqNode; typedef struct{ deqNode* first; deqNode* last; int lenth; }deque; deque* creatdeque() //공백 이중연결덱 형성 { deque *deq; deq=(deque*)malloc(sizeof(deque)); deq->first=NULL; deq->last=NULL; deq->lenth=0; return deq; } int isEmpty(deque*deq){ if(deq->lenth==0) return 1; else return 0; } void insertFirst(deque *deq,element item) { //연결덱에 첫번째 원소 삽입 deqNode *newnode; newnode=(deqNode*)malloc(sizeof(deqNode)); newnode->data=item; if(deq->lenth==0) {deq->first=newnode; deq->last=newnode; newnode->llink=NULL; newnode->rlink=NULL; } else { deq->first->llink=newnode; newnode->rlink=deq->first; newnode->llink=NULL; deq->first=newnode; } deq->lenth++; } void insertLast(deque* deq,element item) { deqNode* newnode; //연결덱의 마지막 원소삽입 newnode=(deqNode*)malloc(sizeof(deqNode)); newnode->data=item; if(deq->lenth==0) { newnode->llink=NULL; newnode->rlink=NULL; deq->first=newnode; deq->last=newnode; } else { deq->last->rlink=newnode; newnode->llink=deq->last; newnode->rlink=NULL; deq->last=newnode; } deq->lenth++; } element deletefirst(deque* deq) { deqNode* temp; //연결덱에서 첫번째 원소를 삭제하고 반환 element item; if(deq->lenth==0) { printf("덱이 비었습니다."); exit(1); } else { item=deq->first->data; temp=deq->first; if(deq->first->rlink=NULL) //원소가 하나일때 { deq->first=NULL; deq->last=NULL; } else { deq->first=deq->first->rlink; //원소가 2이상일때 deq->first->llink=NULL; } deq->lenth--; free(temp); return item; } } element deletelast(deque* deq) { element item; deqNode* temp; //연결덱에서 마지막 원소를 삭제하고 반환 if(deq->lenth==0) { printf("덱이 비었습니다."); exit(1); } else { item=deq->last->data; temp=deq->last; if(deq->last->llink==NULL) { deq->first=NULL; deq->last=NULL; } else { deq->last=deq->last->llink; deq->last->rlink=NULL; } deq->lenth--; free(temp); return item; } } void removefirst(deque* deq) { //연결덱에서 첫번째원소삭제 deqNode * temp; if(deq->lenth==0) { printf("덱이비었습니다."); exit(1); } else { temp=deq->first; if(deq->first->rlink==NULL) {deq->first=NULL; deq->last=NULL; } else { deq->first=deq->first->rlink; deq->first->llink=NULL; } deq->lenth--; free(temp); } } void removelast(deque* deq) { //연결덱에서 마지막원소삭제 deqNode*temp; if(deq->lenth==0) { printf("덱이비었습니다"); exit(1); } else { temp=deq->last; if(deq->last->llink=NULL) { deq->first=NULL; deq->last=NULL; } else { deq->last=deq->last->llink; deq->last->rlink=NULL; } deq->lenth--; free(temp); } } element peekfirst(deque *deq) { if(deq->lenth==0) //연결덱에서 첫번째 원소를 검색해서 반환 { printf("덱이 비었습니다."); exit(1); } else { return deq->first->data; } } element peeklast(deque *deq) { if(deq->lenth==0) //연결덱에서 마지막 원소를 검색해서 반환 { printf("덱이 비었습니다"); exit(1); } else { return deq->last->data; } } int main() { deque*deq; element a,b,c,d; a.key=201501514; strcpy(a.name,"김영희"); b.key=201501515; strcpy(b.name,"김철수"); c.key=201501516; strcpy(c.name,"홍길동"); deq=creatdeque(); insertFirst(deq,a); insertLast(deq,b); insertLast(deq,c); //d=deletefirst(deq); //printf("%d","%s",d.key,d.name); //d=deletelast(deq); //printf("%d","%s",d.key,d.name); //removefirst(deq); //removelast(deq); //d=peeklast(deq); //printf("%d","%s",d.key,d.name); d=peekfirst(deq); printf("%d %s",d.key,d.name); system("pause"); return 0; }
길지만 봐주시면 정말감사하겠습니다... insertfirst와 insertlast 를 실행한뒤 peeklast를 실행하면 쓰레기값이 나오고.
또 removelast deletlast는 실행오류가 납니다....이유를 모르겠네요..귀찮으시겠지만한번만봐주세요.ㅠ
Forums:
일단 주석문의 printf문이 이상하네요.. 마지막
일단 주석문의 printf문이 이상하네요.. 마지막 printf는 잘 쓰셨는데?
로 변경하세요.
removelast 함수에서 if 비교문에서 할당이 이루어졌습니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
아감사합니다. 가장기본적인것에서 실수를햇는데
아감사합니다. 가장기본적인것에서 실수를햇는데 그걸놓쳤네요...말씀대로 조급해하지않고 천천히 살펴보겠습니다.
올려주신 코드를 그대로 copy paste해서 컴파일
올려주신 코드를 그대로 copy paste해서 컴파일 해보았습니다.
컴파일할때는 항상 -Wall 옵션을 주고,
이렇게 발생하는 warning을 반드시 확인하고, 가능하면 모두 없애야 합니다.
그냥 쭉 봤을 때 맥락상 틀렸을 것으로 생각되는 게
그냥 쭉 봤을 때 맥락상 틀렸을 것으로 생각되는 게 일단 두군데 보이네요.(검색으로 찾아보세요)
if(deq->first->rlink=NULL)
if(deq->last->llink=NULL)
감사합니다. 봐주셔서
감사합니다. 봐주셔서
댓글 달기