首页 > 试题广场 >

实现在双向链表中删除一个节点P和在节点P后插入一个节点,写出

[问答题]
实现在双向链表中删除一个节点P和在节点P后插入一个节点,写出这两个函数。
#include <iostream>
using namespace std;

struct DListNode
{
	int value;
DListNode *next;
DListNode *pre;
};

DListNode *createDListNode(int data[],int len)
{
DListNode *head= new DListNode();
head=NULL;
DListNode *p=head;
for(int i=0;i<len;i++)
{
DListNode *node= new  DListNode();
node->value=data[i];
node->next=NULL;
node->pre=NULL;

if(head==NULL)
head=node;
else
{
p->next=node;
node->pre=p;
}
p=node;
}
return head;
}

void printList(DListNode *head)
{
while(head!=NULL)
{
cout<<head->value<<" ";
head=head->next;
}
cout<<endl;
}
   
void insertNode(DListNode *p,  int value)
{
DListNode *node =new DListNode();
node->value=value;
DListNode *next = p->next;
p->next=node;
node->pre=p;
node->next=next;
if(next!=NULL)
next->pre=node;
}

void deleteList(DListNode *head,DListNode *p)
{
if(p->next!=NULL)
{
DListNode *pNext=p->next;
p->next=pNext->next;
pNext->next->pre=p;
p->value=pNext->next->value;
delete pNext;
pNext=NULL;
}
else if(head==p)
{
head=head->next;
head->pre=NULL;
delete p;
p=NULL;
}
else
{
while(head->next!=p)
head=head->next;
head->next=NULL;
delete p;
p=NULL;
}
}


void main()
{   
int data[]={1,2,3,4,5,6,7};
int N = sizeof(data)/sizeof(int);
DListNode *head=createDListNode(data,N);
printList(head);
insertNode(head,8);
printList(head);
deleteList(head,head);
printList(head);

deleteList(head,head->next);
printList(head);
}

发表于 2015-07-19 16:20:45 回复(0)
#include <iostream>
#include <stdio>
#include <stdlib>
template <typename T>
typedef struct ListNode{
    struct ListNode* prio;
    struct ListNode* next;
    T data;
}LISTNODE;
//在一个节点value之后插入节点data
struct ListNode* Insert(ListNode* head,T value,T data){
    ListNode* node=NULL;
    ListNode* node2=NULL;
    if(!head)
        return NULL;
    else{
        node=head;
        while(node->data!=value){
            node=node->next;
        }
        if(node==NULL)
            return NULL;
        else{
            if(node->next){
                node2->prio=node;
                node2->next=node->next;
                node2->data=data;
                node->next=node2;
                node->next->prio=node2;
            }
            else{
                node2->prio=node;
                node2->next=NULL;
                node2->data=data;
                node->next=node2;
            }
        }
    }
    node=head;
    return node;
}
struct ListNode* deleteP(ListNode* head,T data){
    if(head==NULL){
        return NULL;
    }
    else{
        ListNode* node=NULL;
        ListNode* node2=NULL;
        for(node=head;node!=NULL;node=node->next){
            if(node->data==data && node->next!=NULL){
                node->prio->next=node->next;
                node->next->prio=node->prio;
            }
            else if(node->data==data && node->next==NULL){
                node->prio->next=NULL;
            }
            else
                return NULL;
        }
    }
    node=head;
    return head;
}

发表于 2015-06-24 18:01:37 回复(0)
template <typename ElemType>
typedef struct DulNode
{
    struct DulNode *prior;               //前驱指针
    ElemType data;                     //数据
    struct DulNode *next;             //后继指针
} DulNode, *DuLinkList;
//----------------删除操作-----------------------------
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e)
{
    if (!(p = GetElemP_DuL(L, i)))
        return ERROR;
    e = p->data;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    free(p);
    return OK;
}
//-----------------------插入操作---------------------
Status ListInsert_DuL(DuLinkList &L, int i, ElemType &e)
{
    if (!(p = GetElemP_DuL(L, i)))
        return ERROR;
    DuLinkList *s;
    if (!(s = (DuLinkList)malloc(sizeof(DuLNode))))
        return ERROR;
    s->data = e;
    s->prior = p->prior;
    p->prior->next = s;
    s->next = p;
    p->prior = s;
    return OK;
}

发表于 2014-11-13 15:11:04 回复(0)