特定の位置にノードを挿入しようとしています。私のコードでは、位置1の数字は(基本的にリンクリストの先頭に)挿入されているだけで、位置2のデータは挿入していません。temp2に何か問題はありますか?私がプログラムを実行したとき、それは私が思うものを指していません。
ここで尋ねられた宿題の問題をどれだけ嫌っているのかは知っていますが、プログラムのどこが悪いのかわかりません。私はまだ初心者です。先生はリンクリストをうまく説明しませんでした。
コードは次のとおりです。
-私が得ている出力は8 7です
-8と6が5の位置2に挿入されている8 6 7 5を読みたい
/*
Insert node at a given positon in a linked list.
First element in the linked list is at position 0
*/
#include<stdlib.h>
#include<stdio.h>
struct Node
{
int data;
struct Node* next;
};
struct Node *head;
void Insert(int data, int n)
{
Node* temp1 = new Node();
temp1->data = data;
temp1->next = NULL;
if (n == 1){
temp1->next = head;
head = temp1;
return;
}
Node* temp2 = new Node();
for (int i = 0; i < n-2; i++){// i feel like it doesn't even go through this loop
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp2;
}
void print()
{
Node* temp = head;
while(temp != NULL){
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main()
{
head = NULL; //empty linked list
Insert(7,1); //List: 7
Insert(5,2); //List: 7,5
Insert(8,1); //List: 8,7,5
Insert(6,2); //List: 8,6,7,5
print();
system("pause");
}
このようなものを用意して、指定された位置まで移動してから挿入します:
void addNodeAtPos(int data, int pos)
{
Node* prev = new Node();
Node* curr = new Node();
Node* newNode = new Node();
newNode->data = data;
int tempPos = 0; // Traverses through the list
curr = head; // Initialize current to head;
if(head != NULL)
{
while(curr->next != NULL && tempPos != pos)
{
prev = curr;
curr = curr->next;
tempPos++;
}
if(pos==0)
{
cout << "Adding at Head! " << endl;
// Call function to addNode from head;
}
else if(curr->next == NULL && pos == tempPos+1)
{
cout << "Adding at Tail! " << endl;
// Call function to addNode at tail;
}
else if(pos > tempPos+1)
cout << " Position is out of bounds " << endl;
//Position not valid
else
{
prev->next = newNode;
newNode->next = curr;
cout << "Node added at position: " << pos << endl;
}
}
else
{
head = newNode;
newNode->next=NULL;
cout << "Added at head as list is empty! " << endl;
}
}
Node* insert_node_at_nth_pos(Node *head, int data, int position)
{
/* current node */
Node* cur = head;
/* initialize new node to be inserted at given position */
Node* nth = new Node;
nth->data = data;
nth->next = NULL;
if(position == 0){
/* insert new node at head */
head = nth;
head->next = cur;
return head;
}else{
/* traverse list */
int count = 0;
Node* pre = new Node;
while(count != position){
if(count == (position - 1)){
pre = cur;
}
cur = cur->next;
count++;
}
/* insert new node here */
pre->next = nth;
nth->next = cur;
return head;
}
}
Node* InsertNth(int data, int position)
{
struct Node *n=new struct Node;
n->data=data;
if(position==0)
{// this will also cover insertion at head (if there is no problem with the input)
n->next=head;
head=n;
}
else
{
struct Node *c=new struct Node;
int count=1;
c=head;
while(count!=position)
{
c=c->next;
count++;
}
n->next=c->next;
c->next=n;
}
return ;
}
この機能を試してください。
ノードオブジェクトの構造:
class Node
{
private:
int data;
Node *next;
public:
Node(int);
~Node();
void setData(int);
int getData();
void setNext(Node*);
Node* getNext();
};
関数の実装:
ステータス値を返すことは常に神の慣行であり、ここで定義されている定数は、アプリケーションの使用状況のデバッグ/ロギングを目的としています。
//constants
static int const SUCCESS = 0;
static int const FAILURE = 1;
static int const NULL_OBJ = 2;
static int const POS_EXCEED = 3;
int addAt(int data, int pos){
Node *tmp = new Node(data);
if (tmp == NULL){
//print for debugging only.
cout << "Object not created. Out of memory maybe" << endl;
return NULL_OBJ;
}
if (pos == 0){
// add at beginning
tmp->setNext(this->head);
this->head = tmp;
return SUCCESS;
}else{
// add element in between or at end
int counter = 1;
Node* currentNode = this->head;
while (counter < pos && currentNode->getNext() != NULL){
currentNode= currentNode->getNext();
counter++;
}
tmp->setNext(currentNode->getNext());
currentNode->setNext(tmp);
return SUCCESS;
}
cout << "Failed due to unknown reason.";
return FAILURE;
}
ここでの前提は、入力(データと位置)を検証した後に関数を呼び出すことです。関数内のパラメーターを検証することはできますが、お勧めできません。
お役に立てれば。
void addToSpecific()
{
int n;
int f=0; //flag
Node *temp=H; //H-Head, T-Tail
if(NULL!=H)
{
cout<<"Enter the Number"<<endl;
cin>>n;
while(NULL!=(temp->getNext()))
{
if(n==(temp->getInfo()))
{
f=1;
break;
}
temp=temp->getNext();
}
}
if(NULL==H)
{
Node *nn=new Node();
nn->setInfo();
nn->setNext(NULL);
T=H=nn;
}
else if(0==f)
{
Node *nn=new Node();
nn->setInfo();
nn->setNext(NULL);
T->setNext(nn);
T=nn;
}
else if(1==f)
{
Node *nn=new Node();
nn->setInfo();
nn->setNext(NULL);
nn->setNext((temp->getNext()));
temp->setNext(nn);
}
}
私はあなたと同じように挿入プロセスにいくつかの問題があったので、ここに私が問題を解決したコードがあります:
void add_by_position(int data, int pos)
{
link *node = new link;
link *linker = head;
node->data = data;
for (int i = 0; i < pos; i++){
linker = linker->next;
}
node->next = linker;
linker = head;
for (int i = 0; i < pos - 1; i++){
linker = linker->next;
}
linker->next = node;
boundaries++;
}
特定の位置k
に挿入するには、位置k-1
までリストを走査してから挿入する必要があります。
[コードで行ったように、その位置に移動するために新しいノードを作成する必要はありません]ヘッドノードから移動する必要があります。
開始位置に要素を挿入します。リストが空の場合、case-1。 case-2リストが空ではない場合。
#include<iostream>
using namespace std;
struct Node{
int data;
Node* next; //link == head =stored the address of the next node
};
Node* head; //pointer to Head node with empty list
void Insert(int y);
void print();
int main(){
head = nullptr; //empty list
int n,y;
cout<<"how many number do you want to enter?"<<endl;
cin>>n;
for (int i=0;i<n;i++){
cout<<"Enter the number "<<i+1<<endl;
cin>>y;
Insert(y);
print();
}
}
void Insert(int y){
Node* temp = new Node(); //create dynamic memory allocation
temp->data = y;
temp->next = head; // temp->next = null; when list is empty
head = temp;
}
void print(){
Node* temp = head;
cout<<"List is: "<<endl;
while(temp!= nullptr){
cout<<temp->data<<" ";
temp = temp->next;
}
cout<<endl;
}