//기존 원소를 제거하는 함수 bool removeALElement(int position) { bool ret=false; int i=0; if(position>=0 && position<m_CurrentElementCount) { for(i=position;i<m_CurrentElementCount-1;i++) { pElement[i]=pElement[i+1]; }
//연결리스트에 저장되는 노드를 표현 //데이터와 링크가 있다. class ListNode { public: int data; ListNode *pLink; public: ListNode() { data=0; pLink=NULL; cout <<"listnode 생성"<< endl; } ~ListNode() { cout<<"listnode 해제"<<endl; } };
//연결 리스트 구현을 위한 클래스/ class LinkedList { public: //현재 저장된 개수 int m_currentElementCount; //헤더노드 /*이 헤더노드는 데이터 저장을 위한 노드가 아니라 노드의 추가/삭제의 구현의 간편성을 위해 사용하는 일종의 더미노드다. 실제 데이터를 저장하는 다른 노드를 가리키는 포인터의 역할을 수행ㅔ */ ListNode headerNode; //더미노드가 꼭 객체가 아닌 포인터를 동적할당해도..
public : LinkedList() { m_currentElementCount=0; cout <<"linkedlist 생성"<< endl; } ~LinkedList() { cout <<"linkedlist 해제"<<endl; } //연결 리스트 임의의 위치에 새로운 노드가 추가되는 함수 bool addLLElement(int position, ListNode element) { bool ret=false; int i=0; ListNode *pPreNode=NULL; ListNode *pNewNode=NULL; if(position >= 0 && position <=m_currentElementCount) { pNewNode=new ListNode; if(pNewNode!=NULL) { *pNewNode=element; pNewNode->pLink=NULL;
//여기서 pprenode는 추가하려는(position)노드의 위치의 이전노드가 된다. pPreNode=&(headerNode);
int getLinkedListLength() { return m_currentElementCount; }
//리스트내 삭제하려는 함수 bool removeLLElement(int position) { bool ret=false; int i=0; int arrayCount=0; ListNode *pNode=NULL; ListNode *pDelNode=NULL;
arrayCount=getLinkedListLength(); if(position >=0 && position < arrayCount) { //삭제하려는 위치(position)의 이전 노드 위치로 이동한다. //헤더노드를 시작으로 position-1값만큼 이동 pNode=&(headerNode); for(i=0;i<position;i++) { pNode=pNode->pLink; }
class CircularListNode { public: int data; CircularListNode *pLink; };
class CircularList { public: int m_currentElementCount; //현재 저장된 원소의 개수 CircularListNode *pLink; //헤드포인터로 구성 public: bool addCLElement(int position, CircularListNode element) { bool ret=false; int i=0; CircularListNode *pPreNode=NULL, *pNewNode=NULL, *pLastNode=NULL; if(position >=0 && position <= m_currentElementCount) { pNewNode=new CircularListNode; if(pNewNode==NULL) { cout << "메모리 하당오류"<<endl; return ret; } *pNewNode=element; pNewNode->pLink=NULL;
if(position==0) { if(m_currentElementCount==0) { //1. 공백 리스트에서 첫 번째 노드를 추가하는 경우 pLink=pNewNode; pNewNode->pLink=pNewNode; } else { //2. 공백 리스트가 아닌 원형 연결 리스트에서 첫 번째 노드를 추가하는 경우 pLastNode=pLink; while(pLastNode->pLink!=pLink) { pLastNode=pLastNode->pLink; } pLink=pNewNode; pNewNode->pLink=pLastNode->pLink; pLastNode->pLink=pNewNode; } } //3. 중간에 노드를 추가하는 경우 else { pPreNode=pLink; for(i=0;i<position;i++) { pPreNode=pPreNode->pLink; }
//1. 마지막 노드이면서 동시에 첫 번째 노드를 제거하는 경우 if(arrayCount==1) { delete pDelNode; pLink=NULL; } //2. 마지막 노드가 아닌 첫번쨰 노드를 제거하는 경우 else { pLastNode=pLink; while(pLastNode->pLink!=pLink) { pLastNode=pLastNode->pLink; } pLastNode->pLink=pDelNode->pLink; pLink=pDelNode->pLink; delete pDelNode; } } //3. 리스트의 중간 노드를 삭제하는 경우 else { pPreNode=pLink; for(i=0;i<position-1;i++) { pPreNode=pPreNode->pLink; }