当前位置:   article > 正文

双向循环列表的插入和删除_双向循环链表插入

双向循环链表插入

插入 :

  1. DuLNode* InitInsertNode(DuLinkedList &L, ElemType x) {
  2. DuLNode *p = new DuLNode;
  3. p->element = x;
  4. return p;
  5. }
  6. void InsertList(DuLinkedList &L, ElemType x) /* 在 L 的第一个元素前插入新元素 x */ {
  7. DuLNode *p = InitInsertNode(L, x); //犯过的错误,调用L不是&L
  8. p->prior = L;
  9. p->next = L->next;
  10. L->next->prior = p; //犯过的错误,要先修改L->next->prior再修改L->next
  11. L->next = p;
  12. //prior和next都是指向元素本身。指向元素本身就是指向p。L。
  13. }

删除:

  1. DuLNode* InitInsertNode(DuLinkedList &L, ElemType x) {
  2. DuLNode *p = new DuLNode;
  3. p->element = x;
  4. return p;
  5. }
  6. void InsertList(DuLinkedList &L, ElemType x) /* 在 L 的第一个元素前插入新元素 x */ {
  7. DuLNode *p = InitInsertNode(L, x);
  8. p->prior = L;
  9. p->next = L->next;
  10. L->next->prior = p;
  11. L->next = p;
  12. //prior和next都是指向元素本身。元素本身就是p。L。
  13. }
  14. Status DeleteList(DuLinkedList &L, ElemType x)
  15. /* 删除 L 中值为 x 的元素:
  16. 若 L 中存在值为 x 的元素,删除之,且函数返回值 1,
  17. 否则,即L中没有值为 x 的元素,不做删除,函数返回值 0。
  18. 假设 L 中没有值相同的元素 */ {
  19. if (L->next == L && L->next == L) { return 0;/*L里没有元素了*/ }
  20. DuLinkedList temp = L->next;
  21. while (temp != L) {
  22. if (temp->element == x) {
  23. temp->next->prior = temp->prior;
  24. temp->prior->next = temp->next;
  25. return 1;
  26. }
  27. temp = temp->next;
  28. }
  29. return 0;
  30. }

 题干

已知 L 为带头结点的双向循环链表,即 L 为头结点指针,如下图所示。

基本信息及结点结构声明如下:

  1. #define INSERT 1
  2. #define DELETE 2
  3. typedef int Status;
  4. typedef int ElemType;
  5. typedef struct DuLNode * ptrDuLNode;
  6. typedef struct DuLNode{
  7. ElemType element; /* 数据元素 */
  8. ptrDuLNode prior; /* 前驱结点指针 */
  9. ptrDuLNode next; /* 后继结点指针 */
  10. }DuLNode, *DuLinkedList;

本题要求实现如下说明的 InsertList 及 DeleteList 函数,其余函数均有判题测试程序完成,且判题测试程序完成所需要的数据输出。题目测试数据保证正确。

函数接口定义:

  1. void InsertList ( DuLinkedList &L, ElemType x ); /* 在 L 的第一个元素前插入新元素 x */
  2. Status DeleteList ( DuLinkedList &L, ElemType x );
  3. /* 删除 L 中值为 x 的元素:
  4. 若 L 中存在值为 x 的元素,删除之,且函数返回值 1,
  5. 否则,即L中没有值为 x 的元素,不做删除,函数返回值 0。
  6. 假设 L 中没有值相同的元素 */
  1. 判题程序样例如下所示:
  2. int main ( ) {
  3. DuLinkedList L;
  4. ElemType x;
  5. int op;
  6. InitList ( L );
  7. while ( 1 )
  8. {
  9. scanf ( "%d%d", &op, &x );
  10. if ( op == INSERT )
  11. {
  12. InsertList ( L, x );
  13. printf ( "Success: Insert %d\n", x);
  14. }
  15. else if ( op == DELETE )
  16. {
  17. if ( DeleteList ( L, x ) )
  18. printf ( "Success: Delete %d\n", x);
  19. else
  20. printf ( "Failure: Delete %d\n", x);
  21. }
  22. else
  23. break;
  24. }
  25. PrintList( L );
  26. DestroyList ( L );
  27. return 0;
  28. }
  29. void InitList ( DuLinkedList &L ) /* 将 L 初始化为空的双向循环链表。判题测试程序完成 */
  30. {
  31. L = ( ptrDuLNode ) malloc( sizeof ( DuLNode ) );
  32. L->next = L->prior = L;
  33. }
  34. void PrintList( DuLinkedList L ) /* 按头到尾输出线性表 L。判题测试程序完成 */
  35. {
  36. /* 判题测试程序完成,此处略*/
  37. }
  38. void DestroyList ( DuLinkedList &L ) /* 销毁 L 并释放所占用的存储空间。判题测试程序完成 */
  39. {
  40. /* 判题测试程序完成,此处略*/
  41. }
  42. /* 你实现的函数将被插入这里 */

 

假设初始时 L 为空,即 L = ( )。输入数据格式为 op value,其中 op 值为 1 、2 或 0,分别表示插入、删除,或结束;value 为待插入或删除的值。

读入的数据及操作结果说明如下:

1 3,表示插入元素 3,则 插入后 L = ( 3 );

1 2,表示插入元素 2,则 插入后 L = ( 2 3 );

2 1,表示删除元素 1,则 删除后 L = ( 2 3 ),DeleteList函数返回值 0;

2 3,表示删除元素 3,则 删除后 L = ( 2 ),DeleteList函数返回值 1;

0 1,表示操作结束

裁判测试程序样例:

输入样例 1:

  1. 1 3
  2. 1 2
  3. 2 1
  4. 2 3
  5. 0 1

输出样例 1:

  1. Success: Insert 3
  2. Success: Insert 2
  3. Failure: Delete 1
  4. Success: Delete 3
  5. Finally L: 2

输入样例 2:

  1. 1 5
  2. 2 5
  3. 1 1
  4. 2 1
  5. 0 0

输出样例 2:

  1. Success: Insert 5
  2. Success: Delete 5
  3. Success: Insert 1
  4. Success: Delete 1
  5. Finally L: The List is empty.

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号