Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 9, 2011 20:07:44

Win95
От:
Зарегистрирован: 2011-11-04
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

реализация класса содержащего кольцевой односвязный список...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class LinkedList:
#определяется первый и последний элементы списка и его длина
def __init__(self):
self.first = None
self.last = None
self.length = 0
#распечатка содержимого списка
def __str__(self):
if self.first != None:
current = self.first
out = ‘LinkedList [\n’ +str(current.value) +'\n'
while current.next != None:
current = current.next
out += str(current.value) + ‘\n’
return out + ‘]’
return 'LinkedList '
#очистка списка
def clear(self):
self.__init__()
return None
#добавление эл тов в конец списка
def add(self, x):
self.length+=1
if self.first == None:
#self.first и self.last будут указывать на одну область памяти
self.last = self.first = Node(x, None)
else:
#здесь, уже на разные, т.к. произошло присваивание
self.last.next = self.last = Node(x, None)

#удаление списка
def delete(self):
return None
#содание списка
def create(self):
return None
#проверка списка на пустое поле и на нулевую позицию, вставка элемента на нужную позицию
def InsertNth(self,i,x):
if self.first == None:
self.last = self.first = Node(x, None)
return
if i == 0:
self.first = Node(x,self.first)
return
curr=self.first
count = 0
while curr != None:
count+=1
if count == i:
curr.next = Node(x,curr.next)
if curr.next.next == None:
self.last = curr.next
break
curr = curr.next
return None
#Удаление повторяющихся значений
def RemoveDuplicates(self):
if (self.first == None):
return
old=curr = self.first
while curr != None:
if curr.next != None:
if old.value == curr.next.value:
curr.next = curr.next.next
else:
old=curr = old.next
curr=curr.next
return None
#подсчет элементов в списке
def len(self):
length =0
if self.first != None:
current = self.first
while current.next != None:
current = current.next
length +=1
return length+1#+1 для учета self.first

в общем я реализовал этот класс… у меня возникла проблема… мне нужно его потестить, для этого нужно создать модуль проверки содержащий в себе эти тестовые функции…

c r e a t e_l i s t ( ) 􀀀> Li s t
d e l e t e_l i s t ( Li s t ) 􀀀> t rue | error
is_empty ( Li s t ) 􀀀> t rue | f a l s e
ins e r t_i t em ( Li s t , item_index , item) 􀀀> t rue | error
remove_item( Li s t , item_index ) 􀀀> t rue | error
get_item( Li s t , item_index ) 􀀀> item | error
length ( Li s t ) 􀀀> i n t e g e r
вопрос… как это сделать? и мб я что нить неправильно написал в функциях… поправьте меня, если не сложно) буду Вам признателен



Офлайн

#2 Дек. 9, 2011 22:09:30

Win95
От:
Зарегистрирован: 2011-11-04
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

реализация класса содержащего кольцевой односвязный список...

Итак) пока вы все спали я сделал приблизительно это:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#класс Node для определения элемента списка
class Node:
def __init__(self, value = None, next = None):
self.value = value
self.next = next
class LinkedList:
#определяется первый и последний элементы списка и его длина
def __init__(self):
self.first = None
self.last = None
self.length = 0
#распечатка содержимого списка
def __str__(self):
if self.first != None:
current = self.first
out = 'LinkedList [\n' +str(current.value) +'\n'
while current.next != None:
current = current.next
out += str(current.value) + '\n'
return out + ']'
return 'LinkedList []'
#очистка списка
def clear(self):
self.__init__()
return None
#добавление эл тов в начало списка
def push(self, x):
self.length+=1
if self.first == None:
self.last = self.first = Node(x,None)
else:
self.first = Node(x,self.first)
#добавление эл тов в конец списка
def add(self, x):
self.length+=1
if self.first == None:
#self.first и self.last будут указывать на одну область памяти
self.last = self.first = Node(x, None)
else:
#здесь, уже на разные, т.к. произошло присваивание
self.last.next = self.last = Node(x, None)
#проверка списка на пустое поле и на нулевую позицию, вставка элемента на нужную позицию
def InsertNth(self,i,x):
if self.first == None:
self.last = self.first = Node(x, None)
return
if i == 0:
self.first = Node(x,self.first)
return
curr=self.first
count = 0
while curr != None:
count+=1
if count == i:
curr.next = Node(x,curr.next)
if curr.next.next == None:
self.last = curr.next
break
curr = curr.next
#Удаление повторяющихся значений
def RemoveDuplicates(self):
if (self.first == None):
return
old=curr = self.first
while curr != None:
if curr.next != None:
if old.value == curr.next.value:
curr.next = curr.next.next
else:
old=curr = old.next
curr=curr.next
#подсчет элементов в списке
def len(self):
length =0
if self.first != None:
current = self.first
while current.next != None:
current = current.next
length +=1
return length+1#+1 для учета self.first
#Проверка на пустой список
def Nth(self):
if LinkedList != 0:
print u'НЕ Пустой список! :)'
else:
print u'Пустой список :('
#проверка списка на пустое поле и на нулевую позицию, удаление нужного элемента
def Del(self,i):
if (self.first == None):
return
curr = self.first
count = 0
if i == 0:
self.first = self.first.next
return
while curr != None:
if count == i:
if curr.next == None:
self.last = curr
old.next = curr.next
break
old = curr
curr = curr.next
count += 1
И конечно модуль проверки))

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import third_lab_btree
# cоздать пустой список и добавить элементов
print u'Создаем список, добавляем элементы в конец списка'
L = third_lab_btree.LinkedList()
L.add(1)
L.add(2)
L.add(3)
L.add(4)
L.add(5)
L.add(6)
L.add(7)
L.add(8)
L.add(14)
print(L)
#Подсчет элементов в списке
print u'Подсчет элементов в списке'
print L.len()
# добавление второго идентичного элемента
print u'Добавляем элемент, который уже есть в списке, в начало списка'
L.push(14)
print(L)
#Удаление идентичных элементов
print u'Удаление идентичных элементов'
L.RemoveDuplicates()
print(L)
#Вставка элемента на заданную нами позицию (1 - позиция, 18 - элемент)
print u'Вставка элемента на заданную нами позицию (1 - позиция, 18 - элемент)'
L.InsertNth(1,18)
print(L)
#Проверка на пустоту списка
L.Nth()
#Удаление первых 3х элементов
print u'Удаление первых 3х элементов'
L.Del(0)
L.Del(0)
L.Del(0)
print(L)
#Создание копии
import copy
L2 = copy.deepcopy(L)
#Очистка списка
print u'Очистка списка'
L.clear()
print(L)
print u'Итак, мы очистили список L, однако предварительно слелали его копию, по этому мы имеем ====>>>'
print(L2)
По скольку это делали мои кривые руки, прошу посмотреть, и оценить)



Офлайн

#3 Дек. 10, 2011 18:13:55

Win95
От:
Зарегистрирован: 2011-11-04
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

реализация класса содержащего кольцевой односвязный список...

ладно, сам спросил - сам ответил, но у меня появился вопрос?)) как реализовать assert в модуле проверки?) хочу научиться проверять то типу этого (assert L.len() ==9) результат конечно верный(если вставим после первого ввода элементов), следовательно мы не увидим ошибки, но я не понимаю, как использовать assert для других проверок? Объясните плс)



Офлайн

#4 Дек. 10, 2011 18:40:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9851
Репутация: +  853  -
Профиль   Отправить e-mail  

реализация класса содержащего кольцевой односвязный список...

это не кольцевой список
в кольцевом при переходе вперёд он будет возвращаться к началу



Офлайн

#5 Дек. 11, 2011 08:40:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

реализация класса содержащего кольцевой односвязный список...

Win95
мы не увидим ошибки
>>> assert 0,“dsk1”
Traceback (most recent call last):
File “<interactive input>”, line 1, in <module>
AssertionError: dsk1
вот это мы увидим.
А вообще для тестирования есть стандартные модули:
http://docs.python.org/library/unittest.html
http://docs.python.org/library/doctest.html



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version