用 c语言或 Java 语言,编程实现建立一个单链表,并在表中插入一个元素、删除一个元素

用 c语言或 Java 语言,编程实现建立一个单链表,并在表中插入一个元素、删除一个元素

该回答引用chatgpt:



#include <stdio.h>
#include <stdlib.h>

//定义单链表结构体
typedef struct node{
    int data;
    struct node *next;
}Node, *List;

//建立单链表
List createList(int n){
    List head, p, q;
    int i;
    head = (List)malloc(sizeof(Node)); //创建头结点
    head->next = NULL;
    p = head;
    for (i = 0; i < n; i++){
        q = (List)malloc(sizeof(Node)); //创建新节点
        printf("请输入第%d个元素的值:", i + 1);
        scanf("%d", &q->data); //读入节点的值
        q->next = NULL;
        p->next = q; //将新节点插入链表
        p = q;
    }
    return head;
}

//插入元素
List insertNode(List head, int pos, int val){
    List p, q;
    int i;
    p = head;
    for (i = 1; i < pos && p != NULL; i++){
        p = p->next;
    }
    if (p == NULL){
        printf("插入位置非法!\n");
        return head;
    }
    q = (List)malloc(sizeof(Node)); //创建新节点
    q->data = val;
    q->next = p->next; //将新节点插入链表
    p->next = q;
    return head;
}

//删除元素
List deleteNode(List head, int pos){
    List p, q;
    int i;
    p = head;
    for (i = 1; i < pos && p->next != NULL; i++){
        p = p->next;
    }
    if (p->next == NULL){
        printf("删除位置非法!\n");
        return head;
    }
    q = p->next;
    p->next = q->next; //将节点从链表中删除
    free(q); //释放节点空间
    return head;
}

//输出单链表
void printList(List head){
    List p = head->next;
    printf("单链表的元素为:");
    while (p != NULL){
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

//主函数
int main(){
    List head;
    int n, pos, val;
    printf("请输入单链表的长度:");
    scanf("%d", &n);
    head = createList(n);
    printList(head);
    printf("请输入要插入的元素位置和值:");
    scanf("%d%d", &pos, &val);
    head = insertNode(head, pos, val);
    printList(head);
    printf("请输入要删除的元素位置:");
    scanf("%d", &pos);
    head = deleteNode(head, pos);
    printList(head);
    return 0;
}
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/201846
  • 你也可以参考下这篇文章:Java 运算符、表达式和语句(一) (关于逻辑运算符,Java与C语言不同的操作)
  • 您还可以看一下 张明阳老师的深入理解C语言指针和结构体课程中的 指针变量(Java当中的引用)占用几个字节的内存空间(4)小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于建立单链表,可以分为以下几个步骤:

    1. 定义链表结构体,包括节点的值和指向下一个节点的指针。例如:
    typedef struct node {
        int value;
        struct node* next;
    } Node;
    
    1. 创建链表头节点,赋初值为NULL:
    Node* head = NULL;
    
    1. 向链表中插入一个元素,在链表头插入可以用以下代码,其他位置插入需要先找到该位置的前一个节点:
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->value = 1;
    new_node->next = head;
    head = new_node;
    
    1. 从链表中删除一个元素,同样需要找到该节点的前一个节点。在链表头删除可以用以下代码,其他位置删除需要将前一个节点的指针指向该节点的下一个节点,然后释放该节点的内存:
    Node* temp = head;
    head = head->next;
    free(temp);
    

    至于是否需要对链表进行排序或者查找某个元素等操作,需要根据具体需求来实现。以下是一个完整的示例代码,包括建立链表、插入元素、删除元素和释放内存的操作:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node {
        int value;
        struct node* next;
    } Node;
    
    int main() {
        Node* head = NULL;
    
        // insert element at beginning
        Node* new_node = (Node*)malloc(sizeof(Node));
        new_node->value = 1;
        new_node->next = head;
        head = new_node;
    
        // insert element at beginning
        new_node = (Node*)malloc(sizeof(Node));
        new_node->value = 2;
        new_node->next = head;
        head = new_node;
    
        // delete first element
        Node* temp = head;
        head = head->next;
        free(temp);
    
        // insert element at end
        Node* curr_node = head;
        while (curr_node->next != NULL) {
            curr_node = curr_node->next;
        }
        new_node = (Node*)malloc(sizeof(Node));
        new_node->value = 3;
        new_node->next = NULL;
        curr_node->next = new_node;
    
        // print values of linked list
        curr_node = head;
        while (curr_node != NULL) {
            printf("%d ", curr_node->value);
            curr_node = curr_node->next;
        }
    
        // free memory
        curr_node = head;
        while (curr_node != NULL) {
            temp = curr_node;
            curr_node = curr_node->next;
            free(temp);
        }
    
        return 0;
    }
    

    对于Java语言的单链表实现,可以使用Java已经提供的LinkedList类,具体方法参见Java官方文档。