Top Banner
מבוא לתכנות בשפתC רשימה מקושרתTzachi (Isaac) Rosen
17

C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

Mar 13, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

Cמבוא לתכנות בשפת

רשימה מקושרת

Tzachi (Isaac) Rosen

Page 2: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

מגבלות של מערכים

מוגבלים בגודל•בזבזני–גדול מידי –

ההגדלה יקרה–קטן מידי –

הכנסה ומחיקה של אברים•יקרה ועלולה לגרום לבזבוז–

רשימות מקושרות: פתרון•מתגבר על כל הבעיות שמערך מציג–

יוצר בעיה חדשה–אין גישה ישירה•

Tzachi (Isaac) Rosen

Page 3: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

רשימות מקושרות

חד כיוונית•

מעגלית•

דו כיוונית•

ואפשר להמציא עוד•

Tzachi (Isaac) Rosen

Page 4: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

של רשימה מקושרת Link))חוליה

מורכבת משני שדות•

(data)נתונים –

(next)מצביע לחוליה הבאה –

NULLהמצביע יכול להיות גם •

Tzachi (Isaac) Rosen

Page 5: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

רשימה מקושרת חד כיוונית

נייצג רשימה מקושרת באמצעות מצביע לחוליה •Linkמסוג

NULL–רשימה ריקה –

מצביע לחוליה הראשונה של –רשימה לא ריקה –

הרשימה

Tzachi (Isaac) Rosen

Page 6: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

חוליה ברשימההוספה ומחיקה של

הוספה•

מחיקה•

Tzachi (Isaac) Rosen

Page 7: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

Cמבנה חוליה בשפת

Tzachi (Isaac) Rosen

typedef struct link {

int data;

struct link * next;

} Link;

Page 8: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#define RAND(R) ((int) (((double) rand() / RAND_MAX) * R))

#define INT2BOOL(exp) ((exp) ? "true" : "false")

typedef struct link {

int data;

struct link * next;

} Link;

Page 9: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

Link * newLink(int data) {

Link *p = (Link *) malloc(sizeof(Link));

p->data = data;

p->next = NULL;

return p;

}

void insertAfter(Link * p, int data) { // assume p is not NULL

Link *q = newLink(data);

q->next = p->next;

p->next = q;

}

void deleteAfter(Link * p) { // assume p is not NULL

Link *q = p->next;

if (q != NULL) {

p->next = q->next;

free(q);

}

}

Page 10: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

Link * createRandomLinkedList() {

Link *head = NULL;

int length = RAND(10);

if (length > 0) {

head = newLink(RAND(100));

Link * p = head;

int i;

for (i = 1; i < length; ++i) {

insertAfter(p, RAND(100));

p = p->next;

}

}

return head;

}

void deleteLinkedList(Link * head) {

if (head != NULL) {

while (head->next != NULL)

deleteAfter(head);

free(head);

}

}

Page 11: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

Link * insertBefore(Link *p, int data) { // p could be NULL

Link * q = newLink(data);

q->next = p;

return q;

}

Link * mergeIntoLinkedList(Link * head, int data) {

if (head == NULL)

return newLink(data);

if (data < head->data)

return insertBefore(head, data);

Link *p = head;

while (p->next != NULL && p->next->data < data)

p = p->next;

insertAfter(p, data);

return head;

}

Link * createRandomSortedLinkedList() {

Link *head = NULL;

int length = RAND(10);

while (length > 0) {

head = mergeIntoLinkedList(head, RAND(100));

--length;

}

return head;

}

Page 12: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

int linkedListLength(Link * head) {

int n = 0;

while (head != NULL) {

++n;

head = head->next;

}

return n;

}

void printLinkedList(Link * head) {

printf("%2d: ", linkedListLength(head));

while (head != NULL) {

printf("(%2d)", head->data);

head = head->next;

}

printf("\n");

}

Page 13: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

דוגמה מורחבת

Tzachi (Isaac) Rosen

int isMemInLinkedList(Link *head, int k) {

while (head != NULL) {

if (head->data == k)

return 1;

head = head->next;

}

return 0;

}

Link * reverseLinkedList(Link * head) {

Link * p = NULL;

while (head != NULL) {

Link *q = head;

head = head->next;

q->next = p;

p = q;

}

return p;

}

Page 14: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

וברקורסיה

Tzachi (Isaac) Rosen

int isEmpty(Link *list) {

return list == NULL;

}

int head(Link *list) { // assume not an empty linked list

return list->data;

}

Link * tail(Link *list) { // assume not an empty linked list

return list->next;

}

Page 15: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

וברקורסיה

Tzachi (Isaac) Rosen

int length(Link *list) {

if (isEmpty(list))

return 0;

return 1 + length(tail(list));

}

void print(Link * list) {

if (isEmpty(list))

printf("\n");

else {

printf("(%2d)", head(list));

print(tail(list));

}

}

int isMem(Link *list, int k) {

if (isEmpty(list))

return 0;

if (head(list) == k)

return 1;

return isMem(tail(list), k);

}

Page 16: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

וברקורסיה

Tzachi (Isaac) Rosen

Link * reverse(Link *list) {

if (isEmpty(list) || isEmpty(tail(list)))

return list;

Link *p = reverse(tail(list));

list->next->next = list;

list->next = NULL;

return p;

}

Link * mergeInto (Link *list, int data) {

if (list == NULL || data < head(list))

return insertBefore(list, data);

list->next = mergeInto(tail(list), data);

return list;

}

Page 17: C תפשב תונכתל אובמ - BGUipc121/wiki.files/p9.pdfתרשוקמ המישר לש (Link( הילוח תודש ינשמ תבכרומ•)data( םינותנ–)next( האבה

שימוש

Tzachi (Isaac) Rosen

5: (33)(15)(66)(41)(37)false5: (37)(41)(66)(15)(33)5: (33)(15)(66)(41)(37)7: ( 0)(26)(26)(34)(53)(59)(68)8: ( 0)(26)(26)(34)(50)(53)(59)(68)

int main() {

Link *head;

srand(time(NULL));

head = createRandomLinkedList();

printLinkedList(head);

printf("%s\n", INT2BOOL(isMemInLinkedList(head, 3)));

head = reverseLinkedList(head);

printLinkedList(head);

head = reverse(head);

printf("%2d: ", length(head));

print(head);

deleteLinkedList(head);

head = createRandomSortedLinkedList();

printLinkedList(head);

head = mergeInto(head, 50);

printLinkedList(head);

deleteLinkedList(head);

return 0;

}