V tomto článku budeme podrobne chápať aplikácie prepojeného zoznamu.
Čo myslíš tým prepojeným zoznamom?
Prepojený zoznam je lineárna dátová štruktúra pozostávajúca z prvkov nazývaných uzly, pričom každý uzol sa skladá z dvoch častí: informačnej časti a prepojenej časti, ktorá sa tiež nazýva časť ďalšieho ukazovateľa.
Prepojený zoznam sa používa v širokej škále aplikácií, ako napr
top 10 hentai
- Reprezentácia manipulácie s polynomom
- Sčítanie dlhých kladných celých čísel
- Zastúpenie riedkych matíc
- Sčítanie dlhých kladných celých čísel
- Vytvorenie tabuľky symbolov
- Zoznam adries
- Správa pamäte
- Prepojené prideľovanie súborov
- Viacnásobná presná aritmetika atď
Manipulácia s polynómom
Polynomiálne manipulácie sú jednou z najdôležitejších aplikácií prepojených zoznamov. Polynómy sú dôležitou súčasťou matematiky, ktorú väčšina jazykov ako typ údajov prirodzene nepodporuje. Polynóm je súbor rôznych výrazov, z ktorých každý obsahuje koeficienty a exponenty. Môže byť reprezentovaný pomocou prepojeného zoznamu. Táto reprezentácia umožňuje efektívnu manipuláciu s polynómom.
Zatiaľ čo predstavuje polynóm pomocou prepojeného zoznamu, každý pojem polynómu predstavuje uzol v prepojenom zozname. Pre lepšiu efektivitu spracovania predpokladáme, že člen každého polynómu je uložený v prepojenom zozname v poradí klesajúcich exponentov. Taktiež žiadne dva členy nemajú rovnaký exponent a žiadny člen nemá nulový koeficient a bez koeficientov. Koeficient má hodnotu 1.
Každý uzol prepojeného zoznamu predstavujúci polynóm pozostáva z troch častí:
- Prvá časť obsahuje hodnotu koeficientu termínu.
- Druhá časť obsahuje hodnotu exponentu.
- Tretia časť, LINK, ukazuje na ďalší výraz (ďalší uzol).
Štruktúra uzla prepojeného zoznamu, ktorý predstavuje polynóm, je uvedená nižšie:
Uvažujme polynóm P(x) = 7x2+ 15x3- 2 x2+ 9. Tu sú 7, 15, -2 a 9 koeficienty a 4,3,2,0 sú exponenty členov v polynóme. Pri reprezentácii tohto polynómu pomocou prepojeného zoznamu máme
Všimnite si, že počet uzlov sa rovná počtu členov v polynóme. Takže máme 4 uzly. Okrem toho sa termíny ukladajú na zníženie exponentov v prepojenom zozname. Takáto reprezentácia polynómu pomocou prepojených zoznamov veľmi uľahčuje operácie ako odčítanie, sčítanie, násobenie atď.
Sčítanie polynómov:
Aby sme pridali dva polynómy, prechádzame zoznamom P a Q. Vezmeme zodpovedajúce členy zo zoznamu P a Q a porovnáme ich exponenty. Ak sú dva exponenty rovnaké, koeficienty sa sčítajú, aby sa vytvoril nový koeficient. Ak je nový koeficient rovný 0, potom sa výraz vypustí a ak nie je nula, vloží sa na koniec nového prepojeného zoznamu obsahujúceho výsledný polynóm. Ak je jeden z exponentov väčší ako druhý, zodpovedajúci výraz sa okamžite umiestni do nového prepojeného zoznamu a výraz s menším exponentom sa porovná s ďalším výrazom z druhého zoznamu. Ak jeden zoznam končí pred druhým, zvyšok podmienok dlhšieho zoznamu sa vloží na koniec nového prepojeného zoznamu obsahujúceho výsledný polynóm.
Uvažujme príklad, ktorý ukáže, ako sa vykonáva sčítanie dvoch polynómov,
P(x) = 3x4+ 2x3- 4 x2+ 7
Q (x) = 5x3+ 4 x2- 5
Tieto polynómy sú reprezentované pomocou prepojeného zoznamu v poradí klesajúcich exponentov takto:
Na vygenerovanie nového prepojeného zoznamu pre výsledné polynómy, ktorý sa vytvorí sčítaním daných polynómov P(x) a Q(x), vykonáme nasledujúce kroky:
- Prejdite dva zoznamy P a Q a preskúmajte všetky uzly.
- Porovnáme exponenty zodpovedajúcich členov dvoch polynómov. Prvý člen polynómov P a Q obsahuje exponenty 4 a 3. Keďže exponent prvého člena polynómu P je väčší ako druhého polynómu Q, do nového zoznamu sa vloží člen s väčším exponentom. Nový zoznam spočiatku vyzerá takto:
- Potom porovnáme exponent nasledujúceho člena zoznamu P s exponentmi súčasného člena zoznamu Q. Keďže sú oba exponenty rovnaké, ich koeficienty sa pripočítajú a pridajú k novému zoznamu nasledovne:
- Potom prejdeme na ďalší člen zoznamov P a Q a porovnáme ich exponenty. Keďže exponenty oboch týchto členov sú rovnaké a po sčítaní ich koeficientov dostaneme 0, takže člen vypadne a do nového zoznamu sa potom nepripojí žiadny uzol,
- Presunutím na ďalší člen z dvoch zoznamov, P a Q, zistíme, že zodpovedajúce členy majú rovnaké exponenty rovné 0. Pridáme ich koeficienty a pripojíme ich k novému zoznamu pre výsledný polynóm, ako je uvedené nižšie:
Príklad:
C++ program na sčítanie dvoch polynómov
#include using namespace std; int max(int m, int n) { return (m > n)? m: n; } int *add(int A[], int B[], int m, int n) { int size = max(m, n); int *sum = new int[size]; for (int i = 0; i<m; 4 6 i++) sum[i]="A[i];" for (int i="0;" i<n; +="B[i];" return sum; } void printpoly(int poly[], int n) { cout << poly[i]; if (i !="0)" 'x^' ; ' '; main() a[]="{" 5, 0, 10, }; b[]="{" 1, 2, m="sizeof(A)/sizeof(A[0]);" n="sizeof(B)/sizeof(B[0]);" 'first polynomial is '; printpoly(a, m); ' second printpoly(b, n); *sum="add(A," b, m, size="max(m," sum of printpoly(sum, size); 0; < pre> <p> <strong>Explanation:</strong> </p> <p>In the above example, we have created an example of sum of two polynomial using array.</p> <p> <strong>Output:</strong> </p> <p>Below is the output of this example.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-9.webp" alt="Application of Linked List"> <h3>Addition of long positive integer using linked list</h3> <p>Most programming languages allow restrictions on the maximum value of integers stored. The maximum value of the largest integers is 32767, and the largest is 2147483647. Sometimes, applications such as security algorithms and cryptography require storing and manipulating integers of unlimited size. So in such a situation, it is desirable to use a linked list for storing and manipulating integers of arbitrary length.</p> <p>Adding long positive integers can be performed effectively using a circular linked list. As we know that when we add two long integers, the digits of the given numbers are individually traversed from right to left, and the corresponding digits of the two numbers along with a carry from prior digits sum are added. So to accomplish addition, we must need to know how the digits of a long integer are stored in a linked list.</p> <p>The digits of a long integer must be stored from right to left in a linked list so that the first node on the list contains the least significant digit, i.e., the rightmost digit, and the last node contains the most significant digit, i.e., leftmost digit.</p> <p> <strong>Example:</strong> An integer value 543467 can be represented using a linked list as</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-10.webp" alt="Application of Linked List"> <p> <strong>For performing the addition of two long integers, the following steps need to be followed:</strong> </p> <ul> <li>Traverse the two linked lists in parallel from left to right.</li> <li>During traversal, corresponding digits and a carry from prior digits sum are added, then stored in the new node of the resultant linked list.</li> </ul> <p>The first positive long integer 543467 is represented using a linked list whose first node is pointed by NUM1 pointer. Similarly, the second positive long integer 48315 is represented using the second linked list whose first node is pointed by NUM2 pointer. These two numbers are stored in the third linked list whose first node is pointed to by the RESULT pointer.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-11.webp" alt="Application of Linked List"> <h3>Example:</h3> <p> <strong>C++ program for addition of two polynomials using Linked Lists</strong> </p> <pre> #include #include using namespace std; struct Node { int coeff; int pow; struct Node* next; }; void create_node(int x, int y, struct Node** temp) { struct Node *r, *z; z = *temp; if (z == NULL) { r = (struct Node*)malloc(sizeof(struct Node)); r->coeff = x; r->pow = y; *temp = r; r->next = (struct Node*)malloc(sizeof(struct Node)); r = r->next; r->next = NULL; } else { r->coeff = x; r->pow = y; r->next = (struct Node*)malloc(sizeof(struct Node)); r = r->next; r->next = NULL; } } void polyadd(struct Node* poly1, struct Node* poly2, struct Node* poly) { while (poly1->next && poly2->next) { if (poly1->pow > poly2->pow) { poly->pow = poly1->pow; poly->coeff = poly1->coeff; poly1 = poly1->next; } else if (poly1->pow pow) { poly->pow = poly2->pow; poly->coeff = poly2->coeff; poly2 = poly2->next; } else { poly->pow = poly1->pow; poly->coeff = poly1->coeff + poly2->coeff; poly1 = poly1->next; poly2 = poly2->next; } poly->next = (struct Node*)malloc(sizeof(struct Node)); poly = poly->next; poly->next = NULL; } while (poly1->next || poly2->next) { if (poly1->next) { poly->pow = poly1->pow; poly->coeff = poly1->coeff; poly1 = poly1->next; } if (poly2->next) { poly->pow = poly2->pow; poly->coeff = poly2->coeff; poly2 = poly2->next; } poly->next = (struct Node*)malloc(sizeof(struct Node)); poly = poly->next; poly->next = NULL; } } void show(struct Node* node) { while (node->next != NULL) { printf('%dx^%d', node->coeff, node->pow); node = node->next; if (node->coeff >= 0) { if (node->next != NULL) printf('+'); } } } int main() { struct Node *poly1 = NULL, *poly2 = NULL, *poly = NULL; create_node(5, 2, &poly1); create_node(4, 1, &poly1); create_node(2, 0, &poly1); create_node(-5, 1, &poly2); create_node(-5, 0, &poly2); printf('1st Number: '); show(poly1); printf(' 2nd Number: '); show(poly2); poly = (struct Node*)malloc(sizeof(struct Node)); polyadd(poly1, poly2, poly); printf(' Sum of polynomial after addition: '); show(poly); return 0; } </pre> <p> <strong>Explanation:</strong> </p> <p>In the above example, we have created an example of sum of two polynomial using linked list.</p> <p> <strong>Output:</strong> </p> <p>Below is the output of this example.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-12.webp" alt="Application of Linked List"> <h3>Polynomial of Multiple Variables</h3> <p>We can represent a polynomial with more than one variable, i.e., it can be two or three variables. Below is a node structure suitable for representing a polynomial with three variables X, Y, Z using a singly linked list.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-13.webp" alt="Application of Linked List"> <p>Consider a polynomial P(x, y, z) = 10x<sup>2</sup>y<sup>2</sup>z + 17 x<sup>2</sup>y z<sup>2</sup> - 5 xy<sup>2</sup> z+ 21y<sup>4</sup>z<sup>2</sup> + 7. On represnting this polynomial using linked list are:</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-14.webp" alt="Application of Linked List"> <p>Terms in such a polynomial are ordered accordingly to the decreasing degree in x. Those with the same degree in x are ordered according to decreasing degree in y. Those with the same degree in x and y are ordered according to decreasing degrees in z.</p> <h3>Example</h3> <p> <strong>Simple C++ program to multiply two polynomials</strong> </p> <pre> #include using namespace std; int *multiply(int A[], int B[], int m, int n) { int *prod = new int[m+n-1]; for (int i = 0; i<m+n-1; 4 6 i++) prod[i]="0;" for (int i="0;" i<m; { j="0;" j<n; j++) prod[i+j] +="A[i]*B[j];" } return prod; void printpoly(int poly[], int n) i<n; cout << poly[i]; if (i !="0)" 'x^' ; ' '; main() a[]="{" 5, 0, 10, }; b[]="{" 1, 2, m="sizeof(A)/sizeof(A[0]);" n="sizeof(B)/sizeof(B[0]);" 'first polynomial is '; printpoly(a, m); ' second printpoly(b, n); *prod="multiply(A," b, m, ' product of two printpoly(prod, m+n-1); 0; < pre> <p> <strong>Explanation:</strong> </p> <p>In the above example, we have created an example of multiple of two polynomial using arrays.</p> <p> <strong>Output:</strong> </p> <p>Below is the output of this example.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-15.webp" alt="Application of Linked List"> <h2>Some other applications of linked list:</h2> <ul> <tr><td>Memory Management:</td> Memory management is one of the operating system's key features. It decides how to allocate and reclaim storage for processes running on the system. We can use a linked list to keep track of portions of memory available for allocation. </tr><tr><td>Mailing List:</td> Linked lists have their use in email applications. Since it is difficult to predict multiple lists, maybe a mailer builds a linked list of addresses before sending a message. </tr><tr><td>LISP:</td> LISP is an acronym for LIST processor, an important programming language in artificial intelligence. This language extensively uses linked lists in performing symbolic processing. </tr><tr><td>Linked allocation of files:</td> A file of large size may not be stored in one place on a disk. So there must be some mechanism to link all the scattered parts of the file together. The use of a linked list allows an efficient file allocation method in which each block of a file contains a pointer to the file's text block. But this method is good only for sequential access. </tr><tr><td>Virtual Memory:</td> An interesting application of linked lists is found in the way systems support virtual memory. </tr><tr><td>Support for other data structures:</td> Some other data structures like stacks, queues, hash tables, graphs can be implemented using a linked list. </tr></ul> <hr></m+n-1;></pre></m;>
Vysvetlenie:
Vo vyššie uvedenom príklade sme vytvorili príklad súčtu dvoch polynómov pomocou prepojeného zoznamu.
Výkon:
Nižšie je uvedený výstup tohto príkladu.
Polynóm viacerých premenných
Polynóm môžeme reprezentovať s viac ako jednou premennou, t.j. môžu to byť dve alebo tri premenné. Nižšie je uvedená štruktúra uzla vhodná na reprezentáciu polynómu s tromi premennými X, Y, Z pomocou jednoducho prepojeného zoznamu.
Uvažujme polynóm P(x, y, z) = 10x2a2z + 17 x2y z2- 5 xy2z+ 21r4S2+ 7. Pri znázornení tohto polynómu pomocou prepojeného zoznamu sú:
Termíny v takomto polynóme sú usporiadané podľa klesajúceho stupňa v x. Tie s rovnakým stupňom v x sú zoradené podľa klesajúceho stupňa v y. Tie s rovnakým stupňom v x a y sú usporiadané podľa klesajúcich stupňov v z.
Príklad
Jednoduchý program v C++ na násobenie dvoch polynómov
#include using namespace std; int *multiply(int A[], int B[], int m, int n) { int *prod = new int[m+n-1]; for (int i = 0; i<m+n-1; 4 6 i++) prod[i]="0;" for (int i="0;" i<m; { j="0;" j<n; j++) prod[i+j] +="A[i]*B[j];" } return prod; void printpoly(int poly[], int n) i<n; cout << poly[i]; if (i !="0)" \'x^\' ; \' \'; main() a[]="{" 5, 0, 10, }; b[]="{" 1, 2, m="sizeof(A)/sizeof(A[0]);" n="sizeof(B)/sizeof(B[0]);" \'first polynomial is \'; printpoly(a, m); \' second printpoly(b, n); *prod="multiply(A," b, m, \' product of two printpoly(prod, m+n-1); 0; < pre> <p> <strong>Explanation:</strong> </p> <p>In the above example, we have created an example of multiple of two polynomial using arrays.</p> <p> <strong>Output:</strong> </p> <p>Below is the output of this example.</p> <img src="//techcodeview.com/img/ds-tutorial/92/application-linked-list-15.webp" alt="Application of Linked List"> <h2>Some other applications of linked list:</h2> <ul> <tr><td>Memory Management:</td> Memory management is one of the operating system's key features. It decides how to allocate and reclaim storage for processes running on the system. We can use a linked list to keep track of portions of memory available for allocation. </tr><tr><td>Mailing List:</td> Linked lists have their use in email applications. Since it is difficult to predict multiple lists, maybe a mailer builds a linked list of addresses before sending a message. </tr><tr><td>LISP:</td> LISP is an acronym for LIST processor, an important programming language in artificial intelligence. This language extensively uses linked lists in performing symbolic processing. </tr><tr><td>Linked allocation of files:</td> A file of large size may not be stored in one place on a disk. So there must be some mechanism to link all the scattered parts of the file together. The use of a linked list allows an efficient file allocation method in which each block of a file contains a pointer to the file's text block. But this method is good only for sequential access. </tr><tr><td>Virtual Memory:</td> An interesting application of linked lists is found in the way systems support virtual memory. </tr><tr><td>Support for other data structures:</td> Some other data structures like stacks, queues, hash tables, graphs can be implemented using a linked list. </tr></ul> <hr></m+n-1;>