[英]Inserting node into Doubly Linked List
我想將一個包含名稱的newnode插入到雙向鏈接列表的正確位置。 基本上,我想在此處實現插入排序。
這是insert函數的代碼,但是存在問題:
這是該類的代碼:
class Doubly
{
private:
struct node
{
string name; //stores name
node* next; //points to next node
node* prev; //points to previous node
};
node* head; //points to the first node in the list
node* last; //points to the last node in the list
public:
Doubly(); //cstrctr
~Doubly(); //dstrctr
bool empty() const { return head==NULL; }
void insert(const string& );
void remove(const string& );
void print(ostream& OutStream) const;
void sort (bool);
};
這是插入代碼:
void Doubly::insert (const string& input)
{
// Insertion into an Empty List.
if(empty()) //create a new list with one node = Head/Null
{
node* name = new node;
head = name;
last = name;
name -> prev = NULL;
name -> next = NULL;
name -> name = input; //
}
//Insertion into a populated list
else
{
node* newnode;
newnode = head;
while (input > newnode -> name && newnode -> next != last -> next)
newnode = newnode -> next;
if (newnode == head)
{
node* name = new node;
name -> name = input;
name -> prev = newnode;
name -> next = NULL;
head -> next = name;
last = name;
}
else
{
if (newnode == last && input > last -> name) //Add the name to the end of the linked list
{
last -> next = new node;
(last -> next) -> prev = last;
last = last -> next;
last -> next = NULL;
last -> name = input;
}
else
{
node* name = new node;
name -> name = input;
name -> next = newnode;
(newnode -> prev) -> next = name;
name -> prev = newnode -> prev;
newnode -> prev = name;
}
}
}
}
我認為問題是在列表的開頭插入時,您只有一個元素, while (input > newnode -> name && newnode -> next != last -> next)
可能由於兩個原因而退出,並且您假設如果指針仍在頭部,則必須在其后插入它,但也許只是用了一段時間,因為只有一個元素,因此您必須在頭部之前插入一個新元素。
因此,您可能必須執行以下操作:
if (newnode->next == head->next) {
// Create the node and set the common values for all the cases
node* name = new node;
name->name = input;
if (input > newnode->name) { // Insert as second element
name->prev = newnode;
name->next = NULL;
newnode->prev = NULL;
newnodw->next = name;
head = newnode;
last = name;
}
else { // Insert as first element
name->prev = NULL;
name->next = newnode;
newnode->prev = name;
newnodw->next = NULL;
head = name;
last = newnode;
}
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
struct dnode
{
int data;
struct dnode *p,*n;
};
typedef struct dnode dnode;
dnode *start,*last;
dnode *createNode(int ele)
{
dnode *nnode;
nnode=(dnode*)malloc(sizeof(dnode));
nnode->n=NULL;
nnode->data=ele;
return nnode;
}
dnode *insertBegining(int ele)
{
dnode *nnode,*curr,*prev;
nnode=createNode(ele);
if(start==NULL)
{
start=nnode;
nnode->p=NULL;
return start;
}
curr=start;
start=nnode;
nnode->p=NULL;
nnode->n=curr;
curr->p=nnode;
return start;
}
dnode *insertLast(int ele)
{
dnode *nnode,*curr,*prev;
nnode=createNode(ele);
if(start==NULL)
{
start=nnode;
nnode->p=NULL;
return start;
}
curr=start;
while(curr!=NULL)
{
prev=curr;
curr=curr->n;
}
prev->n=nnode;
nnode->p=prev;
return start;
}
void display()
{
dnode *curr;
curr=start;
while(curr!=NULL)
{
printf("%d--->",curr->data);
curr=curr->n;
}
}
void main()
{
int ch,ele;
clrscr();
do
{
printf("\nEnter choice");
printf("\n1-insert beginning");
printf("\n2-insert last");
printf("\n3-display");
printf("\n4-Exit");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("\nEnter Number");
scanf("%d",&ele);
insertBegining(ele);
break;
case 2:
printf("enter number");
scanf("%d",&ele);
insertLast(ele);
break;
case 3:
display();
break;
}
}
while(ch!=4);
getch();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.