标签:关系 cnp pos b2b return ocr init pre cad
将单链表的形式稍作改变,不让最后一个结点的指针为NULL,而让它指向头一个结点,这样就得到了循环链表。
它的优点是:从循环链表中任一结点出发,都能访问遍所有结点。
优点:既可以方便的找前驱,也可以找后继。
双向链表中,每个结点有两个指针域,一个指向直接后继元素结点,另一个指向直接前趋元素结点。
typedef char DataType; struct DoubleNode{ DataType data; DoubleNode* prev; DoubleNode* next; }; typedef DoubleNode* PDoubleNode;
//初始化链表,大小为可以储存n个元素 PDoubleNode InitList(PDoubleNode head,int n){ PDoubleNode p,s; head = (DoubleNode*)malloc(sizeof(DoubleNode));//分配内存 if(head==NULL){ return NULL; } //头节点的初始化 head->prev =NULL; head->next = NULL; p=head; //输入n个元素 for (int i = 0; i < n; i++) { s= (PDoubleNode)malloc(sizeof(DoubleNode)); if (s==NULL) { exit(0); } cout<<"Enter a value"<<endl; cin>>s->data; //指针指向 s->next=NULL; p->next = s; s->prev =p; p=s;//p指向尾节点 } return head; }
换句话说,假设新元素节点为 temp,表头节点为 head,则需要做以下 2 步操作即可:
PDoubleNode insertNode(PDoubleNode head,DataType data,int pos){ PDoubleNode p=head; PDoubleNode q =(PDoubleNode)malloc(sizeof(DoubleNode)); q->data=data; q->next=NULL; q->prev=NULL; //插入到表头需要特殊考虑 if(pos==1){ q->next=head; head->prev=q; head=q; }else { //找到要插入位置的前一个结点 for (int i = 1; i < add-1; i++) { p=p->next; } //判断条件为真,说明插入位置为链表尾 if (p->next==NULL) { p->next=q; q->prev=p; }else { p->next->prev=q; q->next=p->next; p->next=q; q->prev=p; } } return head; }
双链表删除结点时,只需遍历链表找到要删除的结点,然后将该节点从表中摘除即可。
//删除节点 PDoubleNode deleteNode(PDoubleNode head,DataType data) { PDoubleNode p=head; while (p) { if (p->data==data) { p->prev->next=p->next; p->next->prev=p->prev; free(p); return head; } p=p->next; } cout<<"not found"<<endl; return head; }
通常,双向链表同单链表一样,都仅有一个头指针。因此,双链表查找指定元素的实现同单链表类似,都是从表头依次遍历表中元素。
int selectElem(PDoubleNode head,DataType data){ PDoubleNode p = head; int i=1; while (p) { if(p->data==data){ return i; } i++; p=p->next; } return -1; }
PDoubleNode amendElement(PDoubleNode head,int add,DataType newData){ PDoubleNode p = head; for (int i = 0; i < add; i++) { p=p->data; } p->data=newData; }
标签:关系 cnp pos b2b return ocr init pre cad
原文地址:https://www.cnblogs.com/BlairGrowing/p/12983750.html