מבוא לתכנות ולמדעי המחשב בשפת C/מבני נתונים דינמיים - טיפוס לייצוג מבנה הנתונים כולו

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

תבנית:ניווט מבוא

ייצוג רשימה שלמה כ struct[עריכה]

עד כה ייצרנו טיפוס המייצג קודקוד ברשימה אבל לא יצרנו טיפוס המייצג את הרשימה כולה. בהרבה מקרים יש טעם לעשות זאת. הנה דוגמה לרשימה משורשרת המתחזקת את גודלה ומצביעים לתחילתה ולסופה:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct Node {
    int data;
    struct Node* next; 
} Node; 

typedef struct List {
    Node *head; 
    int size; 
    Node *last; 
} List; 


List* newList() {
    List *p = (List*)malloc(sizeof(List)); 
    p->head = p->last = NULL; 
    p->size = 0; 
    return p; 
}

Node* newNode(int data, Node* next) {
    Node *p = (Node*)malloc(sizeof(Node)); 
    p->data = data; 
    p->next = next; 
    return p; 
}

void insertFirst(List *list, int data) {
    if(! list->head) {
	list->head = list->last = newNode(data,NULL); 
	list->size = 1; 
	return; 
    }
    list->head = newNode(data,list->head);
    ++ list->size; 
}

void insertLast(List *list, int data) {
    if(! list->head) {
	list->head = list->last = newNode(data,NULL); 
	list->size = 1; 
	return; 
    }
    list->last->next = newNode(data,NULL); 
    list->last = list->last->next; 
    ++ list->size; 
}

void freeList(List *list) {
    Node *p = list->head;
    Node *p1 = p; 
    while(p) {
	p = p->next; 
	free(p1);
	p1 = p; 
    }
    free(list); 
}

void printList(List *list) {
    Node *p = list->head; 
    while(p) {
	printf("%d --> ",p->data); 
	p = p->next; 
    }
    printf("||   size: %d\n",list->size); 
}

void checkList() {
    int a = 2,i; 
    List *l1 = newList(); 
    List *l2 = newList(); 
    for(i=0; i<10; ++i) {
	insertFirst(l1,a);
	insertLast(l2,a); 
	a*=2; 
    }
    printList(l1); 
    printList(l2); 
    freeList(l1); 
    freeList(l2); 
}


int main() {
    checkList(); 
    return 0; 
}


תבנית:ניווט מבוא