Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用XOR实现每个节点一个指针的双链表_C++ - Fatal编程技术网

C++ 使用XOR实现每个节点一个指针的双链表

C++ 使用XOR实现每个节点一个指针的双链表,c++,C++,我在使用XOR双链接列表时遇到了问题,它有一个指针必须包含节点的下一个和上一个指针。我必须对指针的地址进行异或才能这样做,但我不能。 我可以分配一个从两个地址异或的内存地址,但无法将值分配到其地址(这有分段错误): 现在我不知道地址0x2355和0x23ff是否可以保留? 然后我决定“new”这些指针,然后对它们进行异或运算,如下所示: int* ptr1 = new int //ptr1 is now manage by OS int* ptr2 = new int //lik

我在使用XOR双链接列表时遇到了问题,它有一个指针必须包含节点的下一个和上一个指针。我必须对指针的地址进行异或才能这样做,但我不能。 我可以分配一个从两个地址异或的内存地址,但无法将值分配到其地址(这有分段错误):

现在我不知道地址0x2355和0x23ff是否可以保留? 然后我决定“new”这些指针,然后对它们进行异或运算,如下所示:

int* ptr1 = new int     //ptr1 is now manage by OS
int* ptr2 = new int     //like ptr1 ...
然后,我要对这些指针进行XORing运算,并创建一个新的空间来附加一个节点,该节点是第三个节点,但我无法确定其地址是否正确,但当我要对其进行赋值时,出现了分段错误:

int* ptr1 = new int;    // for example the address is X
int* ptr2 = new int;    // for example the address is Y
int* ptr3 = (int*)((unsigned long)ptr1 ^ (unsigned long)ptr2);    //the final address is X^Y
我怎样才能纠正这个问题? 我不知道如何使用intptr\t和其他请帮助我 谢谢

千万不要那样做 如果您绝对希望将指针强制转换为某个整数类型,请至少使用
intptr\t
(由
头文件提供)


为什么要使用xor指针?这是一个丑陋的把戏!它有点禁用编译器优化。

有一个非常难看的技巧(如果可行的话)让你实现一个双链接列表,每个节点只有一个指针。正如您所说,它需要对指针值进行异或运算

讨论它


这几乎总是一个非常糟糕的主意。这种语言根本不能保证它会起作用

如果必须这样做,请将指针值强制转换为
uintpr\t
intptr\t
(这些类型甚至不能保证存在,但它们可能会存在),在
中声明

两个指针值异或的结果将不是有效的指针,任何试图将其作为一个指针使用的尝试都会在你脸上爆炸(如果你幸运的话)。从这样的操作中获取有效指针的唯一方法是将其反转,获取原始指针值。您的
*ptr2=5并不奇怪导致分段错误

如果你把这当作一种锻炼,只是想看看你是否能让它发挥作用,那就千方百计去玩吧


如果您认为您对此有一些实际要求,您没有。如果您想要一个双链接列表,那么每个节点只有两个指针。或者,更好的是,由于您在C++中编程,使用标准库容器类之一。

< P>使用Turbo C版本3,我们利用一个指针实现了双链链表,利用XOR。传递您的评论……”C’FINDMIND的变更团队

/* Code developed by 'C' The Change Team of FINDMIND
   Prabhakaran D, Vaishnavi N K, N N Priya, guided by
   Mr.Sridhar Arumugaswamy */

#include <stdio.h>
#include <conio.h>

struct Node {
   int data;
   unsigned int next;
}*start, *end, *newNode;

typedef struct Node NODE;

int menu(){
   int choice;
   clrscr();
   printf("1.Add\n2.Display\n3.Exit\n");
   scanf("%d", &choice );
   fflush(stdin);
   return choice;
}

void add() {
   clrscr();
   newNode = ( NODE * ) malloc ( sizeof( NODE ) );
   newNode -> next = 0;
   printf("Enter the data to enter :");
   scanf("%d", &(newNode -> data) );
   fflush(stdin);
   if( start == NULL ) {
      start = end = newNode;
   } else {
      newNode -> next = (unsigned int)end ^ 0;
      end -> next = ( end -> next ^ 0 ) ^ ( unsigned int)newNode;
      end = newNode;
   }
}

void display() {
   NODE *temp, *curr, *prev;
   prev = curr = temp = NULL;
   clrscr();
   for ( curr = start; curr != end ; temp = prev ,\
   prev = curr , curr = ( NODE * ) ( curr -> next ^ (unsigned int)temp ) )
      printf("%d\n", curr -> data );
   printf("%d\n", curr -> data );
   getch();
}

void main() {
   int choice;
   choice = menu();
   do {
      switch( choice ) {
     case 1: add();
         break;
     case 2: display();
         break;
     case 3: printf("\n\nBye!!!");
         break;
     default: printf("Bug dude!!!");
      }
      choice = menu();
   } while(choice != 3);
}
/*由FINDMIND的变更团队“C”开发的代码
Prabhakaran D,Vaishnavi N K,N N Priya,由
Sridhar Arumugaswamy先生*/
#包括
#包括
结构节点{
int数据;
无符号整数next;
}*开始,*结束,*新节点;
typedef结构节点;
int菜单(){
智力选择;
clrsc();
printf(“1.添加\n2.显示\n3.退出\n”);
scanf(“%d”,选择(&C);
fflush(stdin);
回报选择;
}
void add(){
clrsc();
newNode=(NODE*)malloc(sizeof(NODE));
newNode->next=0;
printf(“输入要输入的数据:”);
scanf(“%d”和(newNode->data));
fflush(stdin);
if(start==NULL){
开始=结束=新节点;
}否则{
新建节点->下一步=(无符号整数)结束^0;
end->next=(end->next^0)^(unsigned int)newNode;
end=newNode;
}
}
无效显示(){
节点*temp、*curr、*prev;
prev=curr=temp=NULL;
clrsc();
对于(电流=开始;电流!=结束;温度=上一次\
上一个=当前,当前=(节点*)(当前->下一个^(无符号整数)临时))
printf(“%d\n”,当前->数据);
printf(“%d\n”,当前->数据);
getch();
}
void main(){
智力选择;
选择=菜单();
做{
开关(选择){
案例1:添加();
打破
案例2:显示();
打破
案例3:printf(“\n\n字节!!!”);
打破
默认值:printf(“Bug dude!!!”);
}
选择=菜单();
}while(选项!=3);
}

这是行不通的。是什么让你这么做的?你是什么意思?我怎么能手动分配内存?我想你正在尝试这样做?不要嘲笑它:有一种东西叫做a,它实际上涉及将指针XOR在一起。这家伙可能正试图处理这样一份清单。我希望我能理解他想说的话,那可能会很有趣。如果是英文就好了。@GregHewgill:即使那篇文章有这种形式的链表也可能是不可取的:“这种语言根本不能保证它会起作用。”你能详细说明一下吗?如果指针被重新解释,那么以后你只需要对整数进行数学运算?这应该是安全的,在嵌入式系统上可以节省一些时间memory@luskan:如果将异或指针值存储到指针对象中,则它可能是陷阱表示,或者存储它的行为可能会通过规范化它来更改其表示。如果您只将异或值存储在
uintpr\u t
intptr\u t
类型的对象中,只要您转换回指针类型的唯一
uintpr\u t
值与通过将有效指针值转换为
[u]intptr\u t
得到的值相同,就可以了。但我认为这项技术实际上需要将异或值存储为指针。@KeithThompson:这项技术不需要将值存储为指针,它只是试图达成一种折衷方案,即使用更少的内存而牺牲更多的处理。要存储的数据可以是指针或整数类型(如果数据/地址必须存储在不同的寄存器中,则在某些平台中可能需要更多的处理),但其思想是,如果您更关心内存占用,则可以将其减少一点。
int* ptr1 = new int;    // for example the address is X
int* ptr2 = new int;    // for example the address is Y
int* ptr3 = (int*)((unsigned long)ptr1 ^ (unsigned long)ptr2);    //the final address is X^Y
/* Code developed by 'C' The Change Team of FINDMIND
   Prabhakaran D, Vaishnavi N K, N N Priya, guided by
   Mr.Sridhar Arumugaswamy */

#include <stdio.h>
#include <conio.h>

struct Node {
   int data;
   unsigned int next;
}*start, *end, *newNode;

typedef struct Node NODE;

int menu(){
   int choice;
   clrscr();
   printf("1.Add\n2.Display\n3.Exit\n");
   scanf("%d", &choice );
   fflush(stdin);
   return choice;
}

void add() {
   clrscr();
   newNode = ( NODE * ) malloc ( sizeof( NODE ) );
   newNode -> next = 0;
   printf("Enter the data to enter :");
   scanf("%d", &(newNode -> data) );
   fflush(stdin);
   if( start == NULL ) {
      start = end = newNode;
   } else {
      newNode -> next = (unsigned int)end ^ 0;
      end -> next = ( end -> next ^ 0 ) ^ ( unsigned int)newNode;
      end = newNode;
   }
}

void display() {
   NODE *temp, *curr, *prev;
   prev = curr = temp = NULL;
   clrscr();
   for ( curr = start; curr != end ; temp = prev ,\
   prev = curr , curr = ( NODE * ) ( curr -> next ^ (unsigned int)temp ) )
      printf("%d\n", curr -> data );
   printf("%d\n", curr -> data );
   getch();
}

void main() {
   int choice;
   choice = menu();
   do {
      switch( choice ) {
     case 1: add();
         break;
     case 2: display();
         break;
     case 3: printf("\n\nBye!!!");
         break;
     default: printf("Bug dude!!!");
      }
      choice = menu();
   } while(choice != 3);
}