- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的任务是用链表实现一个集合。我很快就创建了链表,然后开始构建集合。我在设置操作(并集/交集/差集)上遇到了一些困难,但是在实现之后我尝试制作一个驱动程序方法,现在我遇到了包含/添加的段错误。结果我无法正确检查我的操作。我不明白为什么会出现此错误。我忽略了一些东西...任何帮助将不胜感激。
链表.h
class ListNode
{
private:
ListNode* prev;
ListNode* next;
int data;
public:
ListNode() { prev = next = NULL;
data=0;}
ListNode(int d, ListNode* p, ListNode* n) { data = d; prev = p; next = n; }
friend class List;
};
class List
{
private:
ListNode* head;
ListNode* tail;
public:
List() { head = tail = NULL; }
~List();
bool isEmpty() { return head == NULL; }
bool contains(int value);
void addToHead(int value);
void addToTail(int value);
int removeHead();
int removeTail();
int removeAt(int index);
bool remove(int value);
int at(int index);
int valueOf(const ListNode* elem);
const ListNode* getNext(const ListNode* node);
const ListNode* getPrevious(const ListNode* node);
const ListNode* getHead() { return head; }
const ListNode* getTail() { return tail; }
void print();
};
List::~List()
{
while (!isEmpty())
removeTail();
}
bool List::contains(int value)
{
ListNode *tmp = head; // <**This is where error occurs**
while (tmp != NULL && tmp->data != value)
tmp = tmp->next;
return tmp != NULL;
}
void List::addToHead(int value)
{
if (isEmpty())
{
head = tail = new ListNode(value, NULL, NULL);
}
else
{
head = new ListNode(value, NULL, head);
head->next->prev = head;
}
}
void List::addToTail(int value)
{
if (isEmpty())
{
head = tail = new ListNode(value, NULL, NULL);
}
else
{
tail = new ListNode(value, tail, NULL);
tail->prev->next = tail;
}
}
int List::removeHead()
{
int value = head->data;
if (head == tail)
{
delete tail;
head = tail = NULL;
}
else
{
head = head->next;
delete head->prev;
head->prev = NULL;
}
return value;
}
int List::removeTail()
{
int value = head->data;
if (head == tail)
{
delete tail;
head = tail = NULL;
}
else
{
tail = tail->prev;
delete tail->next;
tail->next = NULL;
}
return value;
}
int List::removeAt(int index)
{
// Remove the node at index. Return the int value contained at
// the now removed node. Exit program if an invalid
ListNode *temp = head;
int i=0;
if (index == 0) {
removeHead();
}
while (temp != NULL && i < index-1) {
temp = temp->next;
i++;
}
if (temp == NULL || temp -> next == NULL ) {
exit(1);
}
else{
ListNode* temp2 = temp->next;
temp->next = temp->next->next;
temp2->next = NULL;
delete temp2; }
}
bool List::remove(int value)
{
// Remove the provided value if it is contained in the list. Return true if the
// value was found and remove, return false if no changes were made to the list
ListNode *prev = head;
ListNode* temp = head->next;
if (prev->data==value){
removeHead();
}
else {
while (temp != NULL && temp->data != value) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) {
cout << "No change" << endl;
return false;
} else {
prev->next = temp->next; // unlink the node you remove
delete temp; // delete the node
}
}
}
int List::at(int index)
{
// Returns the int value contained at the node at the provided index. Exit program if
// an invalid index is provided
ListNode *temp = head;
for(int i=1; i < index; i++) {
if (temp -> next == NULL){
exit(1);
}
temp = temp->next;
}
return valueOf(temp);
}
int List::valueOf(const ListNode* elem)
{
return elem->data;
}
const ListNode* List::getNext(const ListNode* node)
{
return node->next;
}
const ListNode* List::getPrevious(const ListNode* node)
{
return node->prev;
}
void List::print() {
ListNode *tmp = head;
if (tmp != NULL) {
do {
if (tmp != NULL) {
cout << tmp->data << " -> ";
tmp = tmp->next;
}
} while (tmp != NULL);
}
cout << endl;
}
#endif //UNTITLED4_LIST_H
设置
#include <iostream>
#include "list.h"
using namespace std;
class Set
{
private:
List* list;
int set_size;
public:
Set();
~Set();
bool contains(int value);
bool add(int value);
bool remove(int value);
void clear();
Set* set_union(Set&);
Set* intersection(Set&);
Set* difference(Set&);
void print();
int size() { return set_size; }
};
Set::Set() {
list = NULL;
set_size = 0;
}
Set::~Set() {
delete list;
set_size = 0;
}
bool Set::contains(int value) {
// Returns a boolean value representing if the provided int value is contained
//in the list
if(list->contains(value)){
return false;
}
else{
list->addToHead(value);
set_size++;
return true;
}
}
bool Set::add(int value) {
// Returns a boolean value representing if the provided int value was successfully
// added to the list do not allow duplicate
if (!contains(value))
{ list->addToTail(value);}
else {return false;}
}
bool Set::remove(int value) {
return list->remove(value);
}
void Set::clear() {
//This function should assign 0 to set_size, and delete list.
set_size = 0;
delete list;
}
Set *Set::set_union(Set &s) {
//Creates and returns a Set pointer that contains the set union of the
//invoking Set object and a second Set object passed into the function
Set *temp = new Set();
for(int t= 1;t<s.set_size; t++)
temp->add(s.list->at(t));
return temp;
}
Set *Set::intersection(Set &s) {
// Creates and returns a Set pointer that contains the set intersection of the
// invoking Set object and a second Set object passed into the function.
Set *temp = new Set();
for ( int i = 0; i < set_size; i++) {
if (s.contains(list->at(i))) {
temp->add(list->at(i));
}
}
return temp;
}
Set *Set::difference(Set &s) {
// Creates and returns a Set pointer that contains the set difference between
// the invoking Set object and a second Set object passed into the function. The
// invoking Set object should be considered the set that is being subtracted from (
// Invoking Set – Parameter Set)
Set *temp = new Set();
for ( int i = 0; i < set_size; i++) {
if (s.contains(list->at(i))) {
temp->add(list->at(i));
}
}
for( int i = 0; i < set_size; i++){
if (temp->contains(list->at(i))) {
s.remove(list->at(i));
}
}
return temp;
}
void Set::print() {
// TO DO --- Already have print in list
}
int main() {
int choice, item, size1, size2;
cout << "Please Enter the starting Value of Set#1:";
cin >> size1;
Set set1;
cout << "\nPlease Enter the starting Value of Set#2:";
cin >> size2;
Set set2;
cout << "\n Enter " << size2 << " numbers in Set1:";
for (int i = 1; i < size1; i++) {
cin >> item;
set1.add(item);
}
cout << "\n Enter " << size2 << " numbers in Set2:";
for (int i = 1; i < size1; i++) {
cin >> item;
set2.add(item);
}
while (choice !=7) {
cout << "1.Insert Element into the Set" << endl;
cout << "2.Delete Element of the Set" << endl;
cout << "3.Size of the Set" << endl;
cout << "4.Union of Set" << endl;
cout << "5.intersections of set" << endl;
cout << "6.difference of set" << endl;
cout << "7.Exit" << endl;
cout << "Enter your Choice: ";
cin >> choice;
switch (choice) {
case 1:
cout << "Enter value to be inserted: ";
cin >> item;
// st.insert(item);
break;
case 2:
cout << "Enter the element to be deleted: ";
cin >> item;
//st.erase(item);
break;
case 3:
cout << "Size of the Set1: ";
cout << set1.size() << endl;
cout << "\nSize of the Set2: ";
cout << set2.size() << endl;
break;
case 4:
break;
case 5:
break;
case 6:
exit(1);
default:
cout << "Wrong Choice" << endl;
}
}
return 0;
}
最佳答案
您的 Set 对象包含一个指向 List
(链表)的指针,该指针在 Set
构造函数中被分配给 NULL
,但没有此 List
的内存已分配。这就是为什么每次您尝试对该 List
进行操作时,您的应用程序都会出现段错误的原因。
您要么需要:
Set
持有一个 List
而不是 List*
)<Set
对象中的 List
(With new
)正确分配内存。关于c++ - 努力使用链表实现 Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49596218/
我有一组称为 nets 的整数集,我正在尝试对其进行迭代以确定是否已将来自或来自的整数添加到现有集合中;如果是这样,我将它们添加到现有集合中(这是为了跟踪电网中所有短路的组合)。 但是,我无法让 se
很奇怪:A 是一个集合,B 是一个集合的集合: Set A=new HashSet(); Set > B=new HashSet>(); 我给他们加了东西,输出 System.out.println
在 Agda 中,forall 的类型以这样的方式确定以下所有类型都是Set1 (其中 Set1 是 Set 的类型, A 的类型是 Set ): Set → A A → Set Set → Set
在 haskell 中我可以写一个函数 f where f :: Set a -> Set a -> Set a 如果我采用 Set Int 类型的两组 s1 和 s2,然后执行 f s1 s2 它将
在使用 Spring 时,我遇到了一个奇怪的问题。我有一个类,它接受一个集合作为输入,因为该类是底层框架的,所以我无法更改它。这是它的声明 private Set evaluate; public S
我是流的新手,我想通过将流操作应用于其条目集来修改 map ,但由于编译错误我无法这样做。 下面的代码只是创建了一个新的 map 对象并为其分配了一些整数值。然后它尝试通过在其条目集上应用流操作来删除
无论我看什么,我都会看到集合的输入是这样完成的: Set set = new HashSet(); 但是,我像这样定义我的集合 Set set = new HashSet(); 而且我仍然进行类型检查
我想对于 set -e 我可以捕获信号,但其他的我不知道。 最佳答案 为了完整性: set -e:如果命令失败则退出 set -u:如果在设置之前引用变量,则会出现错误 set -x:显示运行的命令
Set 维护唯一记录,并在尝试复制现有元素时更新现有记录。 考虑以下两种情况。您认为两者之间哪一个代码更快、更高效? 场景 1:使用 addAll() Set uniqueSet = new Hash
我在 Fedora 上做这个 问题: (sandbox)[root@localhost mysite]# django-admin.py runserver Error: Could not impo
https://codeforces.com/contest/1435/submission/96757666->使用set.upper_bound() https://codeforces.com/
使用 MySQL,我已将连接字符集设置为 UTF-8: SET NAMES 'utf8mb4'; SET CHARACTER SET 'utf8mb4'; 这样我就能以 UTF-8 格式返回所有内容,
在 Spring 3 MVC 中,我有一个称为 SettingsController 的 Controller ,它具有用于显示用户列表的 displayUsers()、saveUser() 和 de
我正在创建一个使用语法的程序,并查看该语法是否为 LL (1)。我想使用模块Set,但是我不知道如何进行,当然set的元素的类型是char,你能帮忙吗? 最佳答案 此答案假设您已经知道如何确定语法是否
好的,所以我重新整理了这篇文章,使其更容易理解(对所有的 Pastebin 感到抱歉,但堆栈溢出在代码格式化方面很愚蠢) 请注意,我不打算存储如下所述的大量数据。我使用我所说的数量的主要原因是为了尽可
我有一个密码,我保存在 Settings.settings 文件中并且我希望该部分被加密。 This是我得到的提示,但我真的不知道如何应用它。 谁能给我一个关于如何加密这样的密码的想法? 最佳答案 您
我在网上搜索并找到了如何在设置中添加特定的自定义数据类型。 我自己插入数据,而不是在程序运行时通过代码插入数据。我的问题是如何将自定义数据类型添加到设计器中的组合框。现在我想通了,需要建议,如何添加这
我一直在尝试将自定义类的自定义集合添加到我的 winforms 项目的应用程序设置中,我觉得我已经尝试了六种不同的方法,包括 this way , this way , this way , 和 th
在 Visual Studio 2008 中调试我的项目时,我的 Settings.settings 文件在构建之间不断重置。有没有办法防止这种情况发生? 谢谢。 最佳答案 好的,我找到了我真正想要的
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 4年前关闭。 Improve this
我是一名优秀的程序员,十分优秀!