单链表的创建,插入,删除,更新,查询的实现(C语言描述)

欢迎各位大神指正~


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

#define SUCCESS 0;        //成功的返回值
#define ERROR -1;          //失败的返回值
typedef char ElemType;     //结点元素类型

//结点结构体
typedef struct Node        
{
    ElemType data;        
    struct Node *next;    //指向下一个结点的指针

}Node;

//创建并初始化单链表(头结点)
Node * initlinkList()     
{
    Node *linkList = (Node *)malloc(sizeof(Node));   //动态申请内存空间
    linkList->next = NULL;                            //初始化next指针
    return linkList;
}

//创建结点
Node * createNode(ElemType data){                  

    Node *node = (Node *)malloc(sizeof(Node));     //动态申请内存空间
    node->data = data;                               //给新结点赋值
    node->next = NULL;

    return node;
}

//头插法插入数据
int insertlinkList(ElemType data, Node *linkList)        
{
    Node *newNode = createNode(data);            //创建一个新结点
    Node  *p = linkList->next;                        //将头结点的next地址赋值给工具人指针p
    linkList->next = newNode;                        //头结点的next指向新结点
    newNode->next = p;                            //新结点的next指向工具人指针指向的结点地址
    return SUCCESS;
}

int insertByIndex(Node *linkList,int i,ElemType data)  //根据索引插入结点(在i结点的后面插入)
{
    if (i <= 0) return -1;                        //判断位置是否合理
    Node *p = linkList;                                //工具人指针指向头结点
    int k = 0;                                    
    while (p->next != NULL && k<i)
    {
        p = p->next;
        k++;
    }
    printf("在 %c 元素后面插入%c\n", p->data,data);   

    Node *newNode = createNode(data);                //创建新结点
    newNode->next = p->next;                        //新结点的next指向p指针指向的结点地址
    p->next = newNode;                                //更新p指针指向的结点的next

    return SUCCESS;

}

//更新某个结点的信息
int updataByIndex(Node *linkList,int i, ElemType data)  
{
    Node *p = linkList;
    if (p == NULL) return -1;
    int k = 0;
    while (p->next != NULL && k<i)
    {
        
        p = p->next;
        k++;
    }
    printf("修改的元素为:%c 修改为:%c\n", p->data,data);
    p->data = data;
    return SUCCESS;
}

//根据索引 i 删除结点
int deletelinkList(Node *linkList, int i)
{
    Node *p = linkList;
    if (p->next == NULL) return -1;
    int k = 0;
    while (p->next != NULL && k<i-1)     //将p指针指向 i-1 结点的地址
    {

        p = p->next;
        k++;
    }
    //printf("删除元素的前一个元素是: %d \n", p->data);

    Node *deleteNode = p->next;         //被删除的结点

    printf("被删除的元素为:%c\n", deleteNode->data);

    p->next = deleteNode->next;            //跳过被删除的结点
    free(deleteNode);                    //释放内存空间
    return SUCCESS;

}

//遍历单链表
void showlinkList(Node *linkList)
{
    
    Node *p = linkList->next;
    
    while (p != NULL)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}

//获取单链表的长度
int getLength(Node *linkList){

    if (linkList == NULL)    return ERROR;

    Node *p = linkList;

    int length = 0;

    if (p->next == NULL){
        printf("当前单链表的长度为%d\n",length);
        return SUCCESS;
    }
    while (p->next != NULL)
    {
        p = p->next;
        length++;
    }
    printf("当前单链表的长度为%d\n", length);

    return SUCCESS;
    

}

int main(){
    
    
    Node *linkList = initlinkList();
    getLength(linkList);
    putchar('\n');

    printf("头插法插入元素\n");
    insertlinkList('A', linkList);
    insertlinkList('B', linkList);
    insertlinkList('C', linkList);
    showlinkList(linkList);
    

    putchar('\n');
    insertByIndex(linkList, 1, 'D');
    showlinkList(linkList);

    putchar('\n');
    updataByIndex(linkList, 2, 'E');
    showlinkList(linkList);

    putchar('\n');
    deletelinkList(linkList, 2);
    showlinkList(linkList);

    putchar('\n');
    getLength(linkList);
    return 0;
}

运行效果:

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值