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

typedef struct node{//定义结构体Node
    int data;
    struct node *next;
}Node;

//函数1:创建整数单链表,输入8个数据,并存储在单链表中
Node *create_list(){
    Node *head, *tail, *pnew;//头结点、尾节点、新节点
    head = tail = NULL;//初始时头结点和尾节点为NULL
    int i, num;
    for(i=0; i<8; i++){//循环8次,输入8个数据
        printf("请输入第%d个数:", i+1);
        scanf("%d", &num);
        pnew = (Node*)malloc(sizeof(Node));//新建一个节点
        if(pnew == NULL){//如果内存分配失败
            printf("内存分配失败!");
            exit(1);//结束程序
        }
        pnew->data = num;
        pnew->next = NULL;
        if(head == NULL){
            head = tail = pnew;//如果链表为空,则头节点为pnew,尾节点也为pnew
        }
        else{
            tail->next = pnew;//如果链表不为空,则在尾节点后添加pnew节点
            tail = pnew;//更新尾节点
        }
    }
    return head;//返回头结点
}

//函数2:遍历并输出单链表中所有数据元素
void print_list(Node *list){
    if(list == NULL)
        return;
    printf("%d ", list->data);
    print_list(list->next);//递归输出下一个节点
}

//函数3:按序号查找,返回数据元素的值或地址
Node *search_by_index(Node *list, int index){
    Node *p;
    p = list;//从头结点开始查找
    int i = 1;
    while(p != NULL && i < index){//循环查找直到找到指定节点或查找完整个链表
        p = p->next;
        i++;
    }

    if(p != NULL)
    {
        printf("按序号查找到的节点的值:%d\n", p->data);
        printf("按序号查找到的节点的地址:%p\n", p);
    }else{
        printf("未按序号查找到指定节点\n");
    }
    return p;//返回查找到的节点指针
}

//函数4:按值查找,返回数据元素的序号或地址
int search_by_value(Node *list, int value){
    Node *p;
    int index = 0;
    for(p = list; p != NULL; p = p->next){
        index++;
        if(p->data == value){//查找到相同的数据元素,返回其序号
            printf("按值查找到的节点的序号:%d\n", index);
            printf("按值查找到的节点的地址:%p\n", p);
            return index;
        }
    }
    printf("未按值查找到指定节点\n");
    return 0;//未查找到,返回0
}

//函数5:指定位置(序号)插入新的数据元素
void insert_by_index(Node *list, int index, int value){
    Node *pnew, *p;
    pnew = (Node*)malloc(sizeof(Node));//新建一个节点
    if(pnew == NULL){
        printf("内存分配失败!");
        exit(1);
    }
    p = search_by_index(list, index);//先查找索引为index的节点
    if(p == NULL){
        printf("位置错误!");
        exit(1);
    }
    pnew->data = value;
    pnew->next = p->next;//新节点的next指针指向p的下一个节点
    p->next = pnew;//p的next指针指向新节点
}

//函数6:删除指定位置(序号)数据元素。
void delete_by_index(Node *list, int index){
    Node *p, *pre;
    p = search_by_index(list, index);//先查找索引为index的节点
    if(p == NULL){
        printf("位置错误!");
        exit(1);
    }
    pre = search_by_index(list, index-1);//再查找索引为index-1的节点,即p的前一个节点
    if(pre == NULL){//如果p是头结点,则pre也为NULL
        list = p->next;//头结点指向p的下一个节点,删除头结点
    }
    else{
        pre->next = p->next;//前一个节点的next指针指向p的下一个节点,删除p节点
    }
    free(p);//释放被删除节点p的空间
}

int main(){
    Node *list;
    int value, index;
    list = create_list();//创建单链表
    printf("原始链表:");
    print_list(list);//遍历并输出单链表中所有数据元素
    printf("\n");




    printf("请输入要查找的序号:");
    scanf("%d", &value);
    search_by_index(list, value);//按值查找并输出结果

    printf("请输入要查找的值:");
    scanf("%d", &value);
    search_by_value(list, value);//按值查找并输出结果

    printf("请输入要插入的值和插入位置:");
    scanf("%d %d", &value, &index);
    insert_by_index(list, index, value);//插入新的数据元素
    printf("插入后的链表:");
    print_list(list);
    printf("\n");

    printf("请输入要删除节点的位置:");
    scanf("%d", &index);
    delete_by_index(list, index);//删除指定位置(序号)数据元素
    printf("删除后的链表:");
    print_list(list);
    printf("\n");

    return 0;
}

 

Posted on 2024-03-08 17:43  北边村的富少  阅读(1)  评论(0编辑  收藏  举报