2013-03-03 2 views
2

저는 C에서 잠시 동안 링크 된 목록을 작성하려고 시도해 왔으며 그렇게하기도했습니다. 이제 전역 포인터/변수를 지역 변수로 대체하려고합니다. 따라서 함수 사이에 구조체를 전달해야합니다. 문제는 피사체에 대해 더 많이 읽을수록 더 많은 실험을 할수록 더 많은 오류와 폭발이 발생한다는 것입니다.전역 변수가없는 연결된 목록

내 코드가 약간 길기 때문에 (100 줄), 나는 그것이 무엇을하고 어떻게하는지 설명하려고 노력할 것이다. 어떤 기능을하기 전에

struct node { 
    char Name[21]; 
    struct node *Next; 
}; 

나는 또한 내 구조체에 대한 포인터를 발표 :

나는 구조체를 발표했다

struct node *global; 

* 세계 전역 포인터가 그렇지?

지금 내 연결된 목록을 처리 그 안에서 새로운 포인터 세 가지 기능이 있습니다

void add(void); //add nodes to list with *global, *pointer and *last 
    struct node *pointer *last; 
void print(void); //print node inside the list with *global and *pointer 
    struct node *pointer; 
void quit(void); //free malloc'd list using *global and *pointer 
    struct node *pointer; 

내가 여기에 다른 함수에 함수에서 어떤 식 으로든 내 구조를 통과하지 오전 나에게 분명하다. 나는 global * global을 함수 내부의 로컬 포인터에 할당하고 있는데, 잘 작동하지만, 배워야하는 것은 아니다.

정확히 내가 여기 어떻게해야하고 무엇을, 나는 나의 문제에 대한 해답을 찾고 있었어요하지만 분명히 나는 ​​그래서

C.

의 기초에 큰 뭔가를 놓친 거지? 내가, 예를 들어,이 인쇄를 추가하고 종료 함수에 전달 될 수있는 내 주요 함수 내에서 링크 된 목록을 만들 수 있도록 어떻게 기능 내부
struct node *global; 

를 이동할 수 있습니다. 그리고 어떻게 이러한 함수에서이 목록을 반환합니까?

또한 원래 구조체는 코드 시작 부분에 있어야합니까? 아니면 전역 포인터/변수를 피하기 위해 각 함수 안에 다시 만들어야합니까?

+0

작업 그것을 고치지 마라. – Mikhail

+0

이 답변이 (http://stackoverflow.com/a/15084897/1057230) 정확하게 당신을 도울 수있는 것이기를 바랍니다 :-) –

답변

1

구조체 노드 * 글로벌은 글로벌 포인터가 아닙니까?

예 포인터는 프로그램 전체에서 사용할 수 있습니다.

어떻게 이동할 수 있습니까? struct node * global;

내 함수 안에 포함되어있어, 예를 들어 함수를 add, print 및 quit에 전달할 주요 함수 내에서 연결된 목록을 만들 수 있습니다. 그리고 어떻게 이러한 함수에서이 목록을 반환합니까?

당신은 두 스타 포인터를 사용해야합니다, 여기 당신의 삽입 (의 구현에

struct listNode {          
    char data; 
    struct listNode *nextPtr; // pointer to next node 
}; 


void insert(**localptr,char item); 
void remove(**localptr,char item); 


int main() 
{ 
listnode * startptr; 
.. 
insert(&startptr,'a'); 
.. 
.. 
remove(&startptr,'b'); 
.. 

} 

을 묘사하는 의사 코드) /, 당신은 시작 주소를 가지고 이동해야한다) (제거하다 목록을 통해 노드를 찾은 후 다음 및 이전 포인터의 백업을 가져 와서 노드를 추가 또는 제거한 다음 이전 및 다음 포인터를 복원합니다.

위의 코드에서 시작 포인터는 main(), 주소는 insert()/remove()의 double star 포인터에 전달되고, ther 글로벌 포인터가 필요 없다.

0

기본 생각은 모든 전역 포인터를 함수의 인수로 전달한다는 것입니다. 예를 들어, add는 전역 변수가 남아 있지 않을 때까지

void add(node *ptr, node *last); 

모든 기능이 작업을 수행하게된다.

0

이처럼 LinkedList의 또 다른 구조체를 정의하려고 : 등등

struct node 
{ 
    type value; 
    node * next; 
} 
struct linkedList 
{ 
    node * first; 
} 

void add(linkedlist a,type data){ 
node * newNode ; 
newNode->value = data; 
newNode->next = a->first; 
a->first = newNode; 
} 

및 ...

를 다음이 돈 파손되지 않은 경우 링크 된 목록

void main() 
{ 
    linkedlist a; 
    type x= somevalue; 
    add(a,somevalue); 

}