it-swarm-vi.com

Chèn nút tại một vị trí nhất định trong danh sách được liên kết C++

Tôi đang cố gắng chèn một nút ở một vị trí nhất định. Trong mã của tôi, các số có vị trí 1 chỉ được chèn (về cơ bản ở đầu danh sách được liên kết) và nó không chèn bất kỳ dữ liệu nào với vị trí 2. Có vấn đề gì với temp2 không? Khi tôi chạy chương trình, nó không chỉ ra bất cứ điều gì tôi nghĩ. 

Tôi biết các bạn ghét bao nhiêu vấn đề bài tập về nhà khi được hỏi ở đây nhưng tôi không biết có gì sai với chương trình của tôi. Tôi chỉ là người mới bắt đầu và giáo viên của tôi đã không giải thích tốt danh sách liên kết.

Mã dưới đây. 

-Đầu ra mà tôi nhận được là 8 7 

-Tôi muốn nó đọc 8 6 7 5 trong đó 6 và 5 được chèn ở vị trí 2

/*
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");
} 
5
Raslion

Chỉ cần có một cái gì đó như thế này, nơi bạn đi qua đến vị trí nhất định và sau đó chèn:

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;
 }
}
6
Pramod Roy
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;
    }    
}
1
Sharvil Shah
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 ;
}
1
Vatsal Prakash

Hãy thử chức năng này. 

cấu trúc của đối tượng nút:

class Node
{
private:
    int data;
    Node *next;

public:
    Node(int);
    ~Node();
    void setData(int);
    int getData();
    void setNext(Node*);
    Node* getNext();
};

Thực hiện chức năng:

Trả về một giá trị trạng thái luôn luôn là một thực hành thần, các hằng số được xác định ở đây có nghĩa là để gỡ lỗi/ghi nhật ký sử dụng ứng dụng.

//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;
}

Giả định ở đây là, bạn sẽ gọi hàm sau khi xác thực các đầu vào (dữ liệu và vị trí). Mặc dù chúng ta có thể xác nhận các tham số bên trong hàm, nhưng nó không phải là một thực hành tốt.

Hi vọng điêu nay co ich.

0
IAmSurajBobade
 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);
 }
 }
0
Khadija

Tôi đã gặp một số vấn đề với quy trình chèn giống như bạn, vì vậy đây là cách tôi giải quyết vấn đề:

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++;
    }
0
Mr. Hello_world

Các liên kết sau có thể giúp bạn chèn nút ở vị trí cụ thể trong các loại danh sách liên kết khác nhau:

Danh sách liên kết đơn: Bấm vào đây

Danh sách liên kết tròn: Bấm vào đây

Danh sách liên kết đôi: Bấm vào đây

Danh sách liên kết đôi nghi ngờ: Bấm vào đây

0
mia

Để chèn tại một vị trí cụ thể k, bạn cần duyệt qua danh sách cho đến vị trí k-1 và sau đó thực hiện thao tác chèn. 

[Bạn không cần tạo một nút mới để đi qua vị trí đó như bạn đã làm trong mã của mình] Bạn nên duyệt qua nút đầu.

0
Dinesh