C语言中单向链表的相关操作

本文主要实现了链表的整表创建和清理;
链表数据的增删改查;
程序中链表整体创建提供了头部插入和尾部插入两种方式;
数据添加也提供了头部插入和尾部插入两种方式;
实际应用中数据一般会采用,先创建链表头指针,然后利用数据添加函数加入数据。
注意:
本文中链表包含头指针,头指针中数据为空;

#include<stdio.h>
#define ERROR -1
#define OK 0
typedef int state;
struct students
{
    int Id;
    int age;
} Student;
struct Node {
    //struct students student;
    int num;
    struct Node *next;
} Node;
//自定义类型将LinkList定义为 struct note *类型
typedef struct Node * LinkList;
//创建单链表
//带头指针的链表(头插法)
void createLinkListFirst(LinkList *L,int Length) {
    LinkList p;
    (*L) = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
    for (int i = 0; i < Length; i++) {
        p = (LinkList)malloc(sizeof(Node));
        p->num = 3 * i;
        p->next = (*L)->next;
        (*L)->next = p;
    }
}

//创建单链表
//带头指针的链表(尾插法)
void createLinkListLast(LinkList *L, int Length) {
    LinkList p;
    LinkList r;
    (*L) = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
    r = (*L);
    for (int i = 0; i < Length; i++) {
        p = (LinkList)malloc(sizeof(Node));
        p->num = 3 * i;
        r->next = p;
        r = p;  
    }
    r->next = NULL;
}
//链表中插入数据
state insData(LinkList *L, int data,int local) {
    LinkList p;
    LinkList tmp;
    p = (LinkList)malloc(sizeof(Node));
    p->num = data;
    int j = 0;
    tmp = (*L);
    while (p != NULL && j < local) {
        tmp = tmp->next;
        j++;
    }
    if (!tmp || j > local)
        return ERROR;
    p->next = tmp->next;
    tmp->next = p;
    return OK;
}
//查找数据
state checkData(LinkList *L, int data,int *local) {
    LinkList p;
    //注意头指针中不含数据,所以第一个数据是(*L)->next;
    p = (*L)->next;
    int i = 0;
    while (p->next != NULL) {
        if (p->num == data) {
            *local = i;
            return OK;
        }
        p = p->next;
        i++;
    }
    if (p->next == NULL) {
        *local = -1;
    }
    return ERROR;
}
//删除数据
state delData(LinkList *L, int local) {
    LinkList p;
    LinkList tmp;
    int i = 0;
    p = (*L);
    int j = 0;
    while (p->next != NULL && j < local) {
        p = p->next;
        j++;
    }
    if (!(p->next) || j > local)
        return ERROR;
    tmp = p->next;
    p->next = tmp->next;
    i = tmp->num;
    free(tmp);
    return OK;
}
//链表整表删除
state clearList(LinkList *L) {
    LinkList p;
    LinkList tmp;
    p = *L;
    while (p->next != NULL) {
        tmp = p->next;
        free(p);
        p = tmp;
    }
    (*L)->next = NULL;
    return OK;
}
//在链表中增加数据(尾部增加)
state addDataFirst(LinkList *L, int data) {
    LinkList p;
    LinkList tmp;
    p = (LinkList)malloc(sizeof(Node));
    p->num = data;
    tmp = *L;
    while (tmp->next != NULL) {
        tmp = tmp->next;
    }
    if (tmp->next == NULL && tmp != NULL) {
        tmp->next = p;
        p->next = NULL;
        return OK;
    }
    else
        return ERROR;
}
//在链表中增加数据(头部增加)
state addDataLast(LinkList *L, int data) {
    LinkList p;
    LinkList tmp;
    p = (LinkList)malloc(sizeof(Node));
    p->num = data;
    p->next = (*L)->next;
    (*L)->next = p;
    return OK;
}
int main() {
    LinkList L;
    LinkList p;
    state error;
    createLinkListLast(&L, 20);
    p = L->next;
    printf("原始数据:\n");
    while (p!=NULL ) {
        printf("%d,", p->num);
        p = p->next;
    }
    printf("\n第13个位置插入5后的数据:\n");
    insData(&L, 5, 13);
    p = L->next;
    while (p != NULL) {
        printf("%d,", p->num);
        p = p->next;
    }

    printf("\n查找数据5:\n");
    int local = -1;
    error=checkData(&L, 5, &local);
    if (error == OK)
        printf("5的位置是:%d", local);
    else if (local == -1)
        printf("\n数据不存在!\n");
    else
        printf("\n查找失败!\n");

    printf("\n查找数据23:\n");
    local = -1;
    error = checkData(&L, 23, &local);
    if (error == OK)
        printf("23的位置是:%d", local);
    else if (local == -1)
        printf("\n数据不存在!\n");
    else
        printf("\n查找失败!\n");


    printf("\n删除后的数据:\n");
    delData(&L, 13);
    p = L->next;
    while (p != NULL) {
        printf("%d,", p->num);
        p = p->next;
    }
    error=clearList(&L);
    if (error == OK) {
        printf("\n链表清理成功!\n");
    }
    printf("\n尾部插入数据:\n");
    addDataFirst(&L, 5);
    p = L->next;
    while (p != NULL) {
        printf("%d,", p->num);
        p = p->next;
    }
    printf("\n头部插入数据:\n");
    addDataLast(&L, 13);
    p = L->next;
    while (p != NULL) {
        printf("%d,", p->num);
        p = p->next;
    }
    getchar();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值