מבוא לתכנות ולמדעי המחשב בשפת 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;
}