创建一个长度为5的双链表,要求删除4个结点,并输入其结果
2条回答 默认 最新
CSDN专家-黄老师 2021-10-29 12:36关注#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node *next; struct node* pre; }*DList, Node; // 保存双向链表的最后一个节点 typedef struct Dlist{ DList back; }*DLL, D; // 创建一个双向链表,number 代表创建节点的个数 DList creatDLL(int number, DLL tail){ printf("你需要输入 %d 个数值 \n", number); int i = 1; // 头部节点的创建 Node *head = (Node*)malloc(sizeof(Node)); printf("请输入第 %d 个节点的指: \n", i); int input_data; scanf("%d", &input_data); head->data = input_data; head->pre = NULL; DList p = head; // 保存head 节点,方便最后直接return p while (i < number){ Node *node = (Node*)malloc(sizeof(Node)); printf("请输入第 %d 个节点的指: \n", ++i); int in_data; scanf("%d", &in_data); node->data = in_data; p->next = node; node->pre = p; node->next = NULL; p = p->next; // 更新 p 节点 } tail->back = p; return head; } // 从头到尾打印节点 void printLinkList(DList head){ int i = 1; while (head != NULL){ printf("第 %d 个节点为: %d \n", i++, head->data); head = head->next; } } // 从尾部到头部打印节点 void printLinkListFromTail(DLL tail){ int i = 1; DList p = tail->back; if (p == NULL) printf("TAIL 为空值 \n"); while (p != NULL){ printf("第 %d 个节点为: %d \n", i++, p->data); p = p->pre; } } // 插入一个节点,考虑头部插入和尾部插入情况 DList insertDNode(DList head, int index, int value, DLL tail){ if (head == NULL) return NULL; // 如果是空节点 DList p = head; Node *node = (Node*)malloc(sizeof(Node)); node->data = value; if (index == 1){ // 头部插入节点 node->next = head; head->pre = node; head = node; } else{ // 找到需要插入的前一个节点 int i = 1; while (i < index-1){ p = p->next; i++; if (p == NULL){ printf("插入位置出错 \n"); return NULL; } } if (p->next == NULL){ // 从尾部插入节点 p->next = node; node->pre = p; node->next = NULL; tail->back = node; // 更新最后一个节点的位置 } else{ // 从首尾之间插入节点 p->next->pre = node; node->next = p->next; p->next = node; node->pre = p; } } return head; } // 删除指定数值的 节点 DList deleteDNode(DList head, int value, DLL tail){ // 考虑删除头部节点,尾节点,找不到情况 DList p = head; // 如果是头部节点 if (head->data == value){ head->next->pre = NULL; head = head->next; return head; } // 找到当前节点 while (p->data != value){ p = p->next; if (p == NULL){ printf("找不到指定的节点 \n"); } } if (p->next == NULL){ // 最后一个节点 p->pre->next = NULL; tail->back = p->pre; // 记录最后一个节点的位置 free(p); } else{ p->pre->next = p->next; p->next->pre = p->pre; free(p); } return head; } int main(){ DLL tail = (DLL)malloc(sizeof(D)); // 初始化 DList head = creatDLL(4, tail); //head = insertDNode(head, 2, 100, tail); //printLinkList(head); head = deleteDNode(head, 1, tail); printLinkList(head); printf("从尾部到头部打印节点 --- \n"); printLinkListFromTail(tail); printf("程序结束--- \n"); return 0; }参考一下,如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报