用c语言编写程序数据结构

创建一个长度为5的双链表,要求删除4个结点,并输入其结果


#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;
}

参考一下,如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢

代码如下,如有帮助,请帮忙采纳一下(给你答的上一个题,如果没问题,也帮忙采纳一下吧),多谢。

img

代码:


#include <stdio.h>
#include <stdlib.h>
struct Node 
{
    int data;
    struct Node *pre,*next;
};

int main()
{
    struct Node* head = 0,*p,*t,*k;
    int i,data;
    int pos;
    printf("请输入5个数字创建链表:");
    for (i=0;i<5;i++)
    {
        p = (struct Node*)malloc(sizeof(Node));
        scanf("%d",&data);
        p->data = data;
        p->next = NULL;
        if (head == 0)
        {
            head = p;
            head->pre = NULL;
            t = head;
        }else
        {
            t->next = p;
            p->pre = t;
            t = p;
        }
    }
    printf("删除4个节点,请输入需要删除的起始位置(1-2):");
    scanf("%d",&pos);
    if (pos ==1)
    {
        i = 0;
        while(i<4 && head )
        {
            t = head->next;
            free(head);
            t->pre = NULL;
            head = t;
            i++;
        }
    }else
    {
        p = head;
        i = 0;
        while(i<pos-1 && p)
        {
            p = p->next;
            i++;
        }
        for(i=0;i<4 && p; i++)
        {
            t = p->pre;
            k = p->next;
            t->next = k;
            if(k)
                k->pre = t;
            free(p);
            p = k;
        }
        
    }

    //显示:
    t = head;
    while(t)
    {
        printf("%d ",t->data);
        t = t->next;
    }
    //释放空间
    while(head)
    {
        t = head->next;
        free(head); 
        head = t;
    }
    head =0;
    return 0;
}