2012-01-03 22 views
6

Tôi đã viết một chương trình khá phức tạp so với những gì tôi đã xử lý cho đến bây giờ. Anyways tại một số điểm tôi có nghĩa vụ phải viết một chức năng mà sẽ thao tác một danh sách struct. Tôi đang cố gắng làm cho câu hỏi này càng đơn giản càng tốt vì vậy tôi đã viết ra một đoạn mã khá đơn giản chỉ để tham khảo. Đây là điều: lúc đầu tôi gọi testf từ một chức năng khác cung cấp cho nó current hợp lệ cũng như i với giá trị bằng 0. Điều này có nghĩa là testf sẽ tự gọi khoảng 100 lần trước khi bắt đầu truy cập phần còn lại của mã. Đây là khi tất cả các phiên bản được tạo của testf sẽ bắt đầu được giải quyết.Làm cách nào để chỉnh sửa con trỏ tới nút danh sách từ một hàm trong đệ quy?

void testf(listnode *current, int *i) { 
    wordwagon *current2; 

    current2 = current; 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(current2, i); 
    } 


    current = current->next; 
    return; 
} 

Nếu, chúng ta hãy nói, tôi đã đủ kết nối các nút danh sách sắp xếp của tôi, là current = current->next; cách chính xác cho các "cuối cùng" chức năng testf để truy cập và chỉnh sửa giá trị của người gọi current2 (đó là của chức năng này current), hoặc tôi có sai lầm khủng khiếp không? Nếu tôi là, cách để thay đổi các biến của hàm người gọi từ bên trong hàm được gọi và chắc chắn chúng sẽ không biến mất ngay khi hàm được gọi trả về? Tôi thấy khó mà nắm bắt được cách con trỏ hoạt động.

Rất có khả năng tôi đã để lại thông tin quan trọng hoặc tôi chưa đặt câu hỏi đủ rõ ràng. Xin vui lòng thông báo cho tôi nếu đó là trường hợp vì vậy tôi có thể chỉnh sửa trong bất cứ điều gì bạn cần.

Xin cảm ơn trước.

+2

Bạn phải vượt qua một poi nter đến con trỏ, hoặc sửa đổi 'current' trước khi bạn recurse –

+0

+1 để cung cấp một ví dụ đơn giản –

Trả lời

4

Bạn có thể vượt qua con trỏ đến một con trỏ trong chức năng của bạn, và derefrence nó để có được một con trỏ listnode trở lại, đây là cách mã sẽ trông giống như sau đó (không kiểm tra cho biên soạn):

void testf(listnode **current, int *i) { // accept pointer to listnode pointer 
    wordwagon *current2; 

    current2 = *current; // retreive pointer value by dereferece 
    if (*i < 100) { 
    *i = *i + 1; 
    current2 = current2->next; 
    testf(&current2, i); // recursively call by reference to the pointer 
    } 

    *current = (*current)->next; /* change the current pointer next pointer, CORRECTED as suggested by Azure */ 
    return; 
} 

đây là một danh sách các bài viết thực sự tốt cho con trỏ học:

a) http://cslibrary.stanford.edu/102/PointersAndMemory.pdf

b) http://cslibrary.stanford.edu/103/LinkedListBasics.pdf

+0

Trong dòng cuối cùng của bạn trước' return', tôi nghĩ bạn chỉ thay đổi giá trị của con trỏ kép trên stack. Hãy thử điều này: '* current = (* current) -> next;' –

+0

@PlatinumAzure, cảm ơn, đã sửa lỗi đó. – DhruvPathak

+0

Không sao cả! Tôi đã từng chạy vào đó mọi lúc và đó là một nỗi đau để gỡ lỗi. –

Các vấn đề liên quan