List-DuLinkedList-将单向循环链表改为双向的

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

List-DuLinkedList-将单向循环链表改为双向的

2.32 已知有一个单向循环链表,其每个结点中含有三个域:prior,data和next,

其中data为数据域,next为指向后继结点的指针域,prior也为指针域,但它的值为NULL。试编写算法将此单向循环链表改写为双向循环链表,即使prior成为指向前驱结点的指针域#include #include

#define N 6

typedef struct DuLNode { //双向循环链表结点

char data;

struct DuLNode *prior;

struct DuLNode *next;

} DuLNode, *DuLinkedList;

void createLinkedList(DuLinkedList &L) { //创建双向循环链表(暂时只设NEXT指针)DuLinkedList p; int i;

L = (DuLinkedList)malloc(sizeof(DuLNode));

L->data = NULL;

L->next = L;

L->prior = NULL;

for(i=N; i>0; i--) {

p = (DuLinkedList)malloc(sizeof(DuLNode));

p->data = getchar(); p->next = L->next; L->next = p;

}

}

void singleToDu(DuLinkedList &L) { //将Prior指针添加上

DuLinkedList p, q;

p = L;

q = p->next;

while(q != L) {

q->prior = p; p = q; q = q->next;

}

q->prior = p;

}

void printList(DuLinkedList L) { //打印双向循环链表

DuLinkedList p;

if(L->prior) {

printf("链表的前驱指针存在,现采用反向遍历\n");

p = L->prior;

while(p != L) {printf("%c ", p->data); p = p->prior;}

} else {

printf("链表的前驱指针不存在,将采用正向遍历\n");

p = L->next;

while(p != L) {printf("%c ", p->data); p = p->next;}

}

}

void main() {

DuLinkedList L;

printf("请输入%d个结点的值:\n", N); createLinkedList(L);

printList(L);

singleToDu(L); printf("\n");

printList(L); printf("\n");

}

相关文档
最新文档