Линейный счетчик является линейной структурой, которая является ограниченной последовательности, которая имеет одинаковый элемент данных типа N (n ≥ 0).
1. Массив
Массив имеет верхние и нижние границы, а элементы массива непрерывны в верхних и нижних границах.
Схематическая схема массива 10,20,30, 40, 50 50 заключается в следующем:
Особенности массива : данные непрерывны;
Немного более сложный массив - многомерная массива и динамический массив. Для языка C многомерный массив также реализуется с помощью одного измерного массива. Что касается динамического массива, это массив способности индексной группы, которая может динамически расти; Vector;
Во -вторых, один связанный список .
Схематическая схема одного связанного списка заключается в следующем:
Голова головки пуста, узлом преемника головы является «Узел 10» (узел данных 10), а узлом преемника «Узел 10» является «Узел 20» (данные с данными 10) ,. ..
Узел для удаления одной цепи
Удалить "Узел 30"
Перед удалением: Узел преемника «Узел 20» - «Узел 30», а узел преемника «Узел 30» - «Узел 40».
После удаления: Узел преемника «Узел 20» - это «Узел 40».
Один связанный список добавлен узел
Добавьте «Узел 15» между «Узел 10» и «Узел 20»
Перед добавлением: Узел преемника «Узел 10» - «Узел 20».
После добавления: Узел преемника «Узел 10» - «Узел 15», а узел преемника «Узел 15» - «Узел 20».
Характеристика одного связанного списка состоит в том, что направление ссылки узла составляет один из них;
В -третьих, два связанных списка связанных
Двухчастотный список (Dual Linked List) -это тип связанного списка. Как один связанный список, список двойной цепи также состоит из узлов. Следовательно, начиная с любого узла в двух связанном списке, вы можете легко получить доступ к его передним узлам и последующим узлам. Как правило, мы все строим двухэтажный круглый список.
Схематическая схема списка с двойной связью следующая:
Заголовок пуст, узлом преемника головы является «Узел 10» (узел данных 10); Преемник Узел «Узел 10»; Полем
Двойная цепная часа удаляет узел
Удалить "Узел 30"
Перед удалением: Узел преемника «Узел 20» -это «Узел 30», а предварительным узлом «Узел 30» является «Узел 20». Узел преемника «Узел 30» -«Узел 40», а предварительным нодом «Узел 40» является «Узел 30».
После удаления: Узел преемника «Узел 20» -это «Узел 40», а предварительным узлом «Узел 40» является «Узел 20».
Список двойных ссылок Добавление узлов
Добавьте «Узел 15» между «Узел 10» и «Узел 20»
Перед добавлением: Узел преемника «Узел 10» - это «Узел 20», а предыдущий узел «Узел 20» - «Узел 10».
После добавления: Узел преемника «Узел 10» -это «Узел 15», а предварительным узлом «Узел 15» является «Узел 10». Узел преемника «Узел 15» - «Узел 20», а предыдущий узел «Узел 20» - «Узел 15».
Реализация списка двойной цепочки представлена ниже, а три реализации C/C ++/Java представлены соответственно.
1. C реализуйте двойной связанный список
Реализуйте код два -часовый файл списка (double_link.h)
#Ifndef_double_link_h#define_double_link_h // Создайте «два -часный список связанного списка». Успех, верните в голову; Успех, вернуть 0; Вернитесь в 1 для пустоты; extern int dlink_is_empty (); Успех, вернуться к указателю узла; Extern void* dlink_get (int index); Успех, вернуться к указателю узла; extern void* dlink_get_first (); Успех, вернуться к указателю узла; extern void* dlink_get_last (); Успех, возврат 0; extern int dlink_insert (int index, void *pval); Успех, возврат 0; extern int dlink_insert_first (void *pval); Успех, возврат 0; extern int dlink_append_last (void *pval); Успех, вернуть 0; Успех, вернуть 0; Успех, возврат 0;
Double_link.c в двухстороннем связанном списке
#include <stdio.h> #include <malloc.h>/*** C Lingle Двухсторонний связанный список может хранить произвольные данные. ** @author Skywang* @Date 2013/11/07*/// Два -часные узлы списка Typedef struct tag_node {stroct Tag_node*prev; Обратите внимание, что значение головы не хранит значение элемента! Пересечение Пересечение Статический узел *phead = null; Статический int count = 0; // Создать новый "узел". Успех, вернуться к указателю узла; Статический узел *create_node (void *pval) {node *pnode = null; "); Return null;} // по умолчанию, первый узел и последний узел точки pnode в свой собственный pnode-> prev = pnode-> next = pnode; // Значение узла-pvalpnode-> p = PVAL; Успех, возврат 0; int create_dlink () {// Создать заголовок phead = create_node (null); Return count == 0;} // возвращается в «двух -частский список" int dlink_size () {return count;} // Получить "узел в положении индекса в двухэлектрическом списке" Статический узел* get_ node (node (int index) {ifx <0 || index> = count) {printf ("%s не удалось! Индекс из границы!/n", __func __); if (index <= (count/2) {int i = 0; Поиск int j = 0; Узел "Статический узел * g et_first_node () () return get_node (0);} // Получить" последний узел "статический узел * get_last_node () {return get_node (count-);} // Получить" элемент индекса позиции В двухстороннем связанном списке ". Успех, возвращение узла; void * dlink_get (int index) {node * pindex = get_node (index); 1 个元素的值 »void* dlink_get_first () {return dlink_get (0);} // 获取« 双向链表中最后 1 个元素的值 »void* dlink_get_last () {return dlink_get (count- 1);} // Вставьте «Pval» в индексное положение. Успех, возврат 0; int dlink_insert (int index, void * pval) {// вставить заголовок if (index == 0) return dlink_insert_first (pvalt (pval); // Получить узел узла, соответствующий положению, чтобы быть вставленным. if! Pindex) возвращает -1; // 创建 «节点» узел *pnode = create_node (pval); if (! pnode) return -1; pnode-> prev = pindex-> prev; pnode-> next = pindex; pindex -> Prev-> Next = PNODE; {node *pnod e = create_node (pval); ++; ; Связанный список ". Успех, возврат 0; int dlink_delete (int index) {node *pindex = get_node (index); > next-> prev = pindex-> prev; pindex-> prev-> next = pindex-> next; free (pindex); count-; return 0;} // 删除第一个节点 int dlink_delete_first () {return dlink_delete (0);} // удалить узел int dlink_delete_last () {return dlink_delete (count-);} // revisit "Двусторонний список". Успех, возврат 0; int destroy_dlink () {if (! phead) {printf ("%s не удалось! Dlink is null!/n", __func __); ;
Двух методов теста на связанный список (dlink_test.c)
#include <stdio.h> #include "double_link.h"/*** c Language для реализации двухэтажного связанного списка программы. ** (01) int_test ()* демонстрировать «int data» в двухстороннем связанном списке. * (02) string_teest ()* демонстрировать «строительные данные» в двухстороннем связанном списке. * (03) object_teest ()* Продемонстрировать «объект» в двухэтажном связанном списке. ** @author Skywang* @date 2013/11/07* /// Двухсторонняя операция списка int data void () {int iarr [4] = {10, 20, 30, 40}; n ----%s ------ ", __func __); create_dlink (); // Создать двусторонний связанный список dlink_insert (0, & iarr [0]); // вставить данные dlink_insert (0, & & Ig & & & & & Ig & & & 1]); Data Printf ("dlink_is_empty () =%d/n", dlink_is_empty ()); Размер двухстороннего списка двухстороннего списка Int i; ) dlink_get (i); двадцать "," Тридцать "," fringf ("/n ----%s ----%s--/n", __func __); 0, SARR [0]); Два -Связанный список; n ", dlink_size ()); // Размер двухэлектрического связанного списка // Распечатайте все данные int i в двух -связующем списке; char *p; int sz = dlink_size (); for (i = 0; tag_stu {int id; {40, {40, {40, {40, "dan"},};#define arr_stu_size ", __func __); create_dlink (); // Создать двухэтажный список Dlink_insert (0, & arr_stu [0] ); "dlink_is_empty () =%d/n", dlink_is_eml ()); Два -Связанный список // Все данные в двухстороннем списке INT I; ) dlink_get (i); ); string_test (); Object_Test (); Вернуть 0;}
Результат бега
---- int_test ---- dlink_is_empty () = 0dlink_size () = 3dlink_get (0) = 30d_get (1) = 20dlink_get 0dlink_size () = 3dlink_get (0) = thirtydlink_get (1) = twentydlink_get (2) = ten -Object_test ---- dlink_is_empty () = 0dlink_size () = 3dlink_get (0) = [30, vic] dlink_get (1) = [20, jody] dlink_get (2) = [10, Sky]
2. C ++ реализует список двойной цепи
Реализуйте код два -часовый файл списка (doublelink.h)
#Ifndef double_link_hxx#определить double_link_hxx#включить <iostream> пространство имен STD; PREV, DNODE *Далее) {This-> Value = T; size (); int delete_last (); ) {// Создать "скорость". Примечание: на голове нет данных хранения! Phead = new dnode <t> (); > :: ~ doughlink () {// Удалить все узлы dnode <t>* ptmp; ; удалить Ptmp;} // Удалить "Head" Список цепи 为空 шаблон <класс t> int doubleLink <t> :: is_empty () {return count == 0;} // 获取第 Индекс 位置的节点 шаблон <class t> dnode <t>* doubleLink <T>:: : get_node (int index) {// Достоверность параметров суждения if (index <0 || index> = count) {cout << " / Нахождение if (index <= count/ 2) {int i = 0; ;} / / Обратный поиск int j = 0; ; Temple <class t> trivelink <t> :: get_first () {return get_node (0)-> value;} // Получить значение последнего узла. Индекс позиция перед шаблоном <класс t> int doubleLink <t> :: insert (int index, t t) {ifx == 0) вернуть insert_first (t) ;; > Prev, prev); Шаблон <класс t> int doublelink <t> :: insert_fring (t) {dnode <t>* pnode = new dnode <t> (t, phead-> Далее); > Next = pnode; > Prev = pnode; > Next-> prev = pindex-> prev; T> int DoubleLink <T> :: delete_first () {return del (0);} // 删除最后一个节点 шаблон <class t> int doublelink <t> :: delete_last () {return del (count-);} #Endif
Двухчастотный файл тестирования списка (dlinktest.cpp)
#include <iostream> #include "doublelink.h" userpace std; --- "<< endl; // Создать двусторонний связанный список DoubleLink <int>* pdlink = new DoubleLink <int> (); pdlink-> append_last (10); << "is_empty () =" << pdlink-> is_empty () << endl; << endl; -> get (i) << endl;} void string_test () {string sarr [4] = {"ten", "двадцать", "тридцать", "сорок"}; ---- "" << endl; Второй элемент в SARR в первом Pdlink-> append_last (sarr [0]); ); () = "<< pdlink-> size () << endl; // Все данные int sz = pdlink-> size (); for (int i = 0; i <sz; i ++)" <") = "<< pdlink-> get (i) << endl;} struct stu {int id; war name [20];}; static stu arr_stu [] = {10," Sky "}, {20 20," Jody "}, {30," vic "}, {40," dan "},};#define arr_stu_size cout <<"/n ---- object_test ---- "<< endl; // Создание двух- Связанный список DoubleLink <stu>* pdlink = new DoubleLink <stu> (); > Append_last (arr_stu [0]); в первую позицию // будь то двусторонний список, пустым << "is_empty () =" << pdlink-> is_empty () << endl; = "<< pdlink-> size () << endl; // Распечатать все данные int sz = pdlink-> size () в двустороннем связанном списке; = 0; i <sz; i ++) {p = pdlink-> get (i); main () {int_teest (); string_test (); Object_Test (); Вернуть 0;}
Пример описания
В приведенном выше примере я поместил «оператор» и «реализацию» двухстороннего связанного списка в файле заголовка. Технические характеристики программирования предупреждают нас: отделяйте объявление и реализацию претензии, а сумма файла заголовка (.h File или .hpp) содержал только оператор и отвечал за реализацию в файле реализации (файл .cpp)!
Так почему ты это делаешь? Это связано с тем, что в реализации двухпользованного списка принятие шаблона; Проще говоря, если он объявлен в DoubleLink.h и реализован в DoubleLink.cpp; По конкретным причинам вы можете ссылаться на «Почему компиляторы C ++ не могут поддерживать отдельную компиляцию шаблонов».
Результат бега
---- int_test ---- is_empty () = 0size () = 3pdlink (0) = 30pdlink (1) = 20pdlink (2) = 10 ---- string_test ----- empty () = 0size () = 3pdlink (0) = thirtypdlink (1) = twentypdlink (2) = ten ---- Object_teest ---- is_empty () = 0size () = 3pdlink (0) = [30, vic] pdlink (1) = [ 20 20, Джоди] Pdlink (2) = [10, небо]
3. Java реализует список двойной цепи
DoubleLink.java реализация
/*** Двух методов связанного списка Java. * Примечание: в пакете сбора Java есть двухэтажный список. / Top Headpate dnode <t> mhead; {this.value = value; Примечание: на голове нет данных хранения! Mhead = new dnode <t> (null, null, null); Return mcount;} // Является ли связанный список пустым Boolean isempty () {return mcount == 0;} // Узел Private dnode <t> getNode (int index) {ifx) {index <0 || index> = MCOUNT) НАСТОЯЩАЯ НЕПРАВИЛЬНОЕ ИНДЕКСУТА ;} // 反向查找 dnode <t> rnode = mhead.prev; int rindex = mcount - index -1; for (int j = 0; j <rindex; j ++) rnode = rnode. / Получить значение узла индекса. <t> (T, Mhead, Mhead.next); T> (t, inode.prev, inode); Public void insertfirst (t t) {insert (0, t);} // Добавить узел в конце связанного списка Public void appendlast (t t) {dnode <t> new dnode <t> (t, mhead. Prev Mhead); .next = inode.next; Node public void deletelast () {del (mcount-);}}
Программа тестирования (dlinktest.java)
/*** Двух методов связанного списка Java. * ПРИМЕЧАНИЕ: В пакете коллекции есть двухэтажный список, который поставляется с Java. Два -чатная таблица операции int intatic void int_teest () {int [] {10, 20, 30, 40}; = New DoubleLink <Integer> (); Первая позиция // Будет ли два связанного списка. d/n ", dlink.size ()); // распечатать все узлы для (int i = 0; i <dlink.size (); i ++) System.out .println (" dlink ("+i+") = "+dlink.get (i));} private static void string_test () {string [] sarr = {" ten "," двадцать "," тридцать "," сорок ""}; /n ---- string_test ---- "); // Создать двусторонний связанный список DoubleLink <string> dlink = new DoubleLink <string> (); [1]); // Вставить второй элемент в Sarr в первую позицию dlink.appendlast (sarr [0]); Первая позиция //, является ли два двухстороннего связанного списка пустым системой. =%d/ n ", dlink.size ()); // распечатать все узлы для (int i = 0; i <dlink.size (); i ++) System.out.println (" dlink ("+i+ ") ="+dlink.get (i));} // Внутренний класс OuverRidePublic String toString () {"+id+", "+name+"] ";} tudent [] Studers = new Student [] {новый студент (10," Sky "), новый студент (20," Jody "), новый Студент (30, "Vic"), новый студент (40, "Дан"),}; Двухсторонний список Dooblerink <Tlden> dlink = new DoubleLink <tlood> (); Первый элемент в студентах в dlink.insertfirst (студенты [студенты [студенты [2]); printf ("isempty () =%b/n", dlink.isempty ()); узлы для (int i = 0; i <dlink.size ()); Static void main (string [] arts) {int_test (); string_test (); Object_Test (); }}
Результат бега
---- int_test ---- isempty () = falsesize () = 3dlink (0) = 30dlink (1) = 20dlink (2) = 10 ---- String_test ——- isempty () = falsesize () = 3dlink (0) = ThirtyDlink (1) = TwentyDlink (2) = Ten ---- Object_teest --- isempty () = falsesize () = 3dlink (0) = [30, vic] dlink (1) = [20 20 , Джоди] dlink (2) = [10, небо]
Выше всего содержимое этой статьи.