单链表(C语言)——(1)

本节:使用C语言实现单链表的创建、指定位置插入数据、顺序循环遍历、指定位置删除数据、指定位置查询数据。启用头结点作为开始节点,即作为第一节点,由于头结点无前驱节点,故在操作上需要特殊处理。

main.c文件

//
//  main.c
//  learn
//
//  Created by shang wang on 2021/7/10.
//

#include <stdio.h>
#include "link.h"

int main(int argc, const char * argv[]) {
    
    int flag = 0;
    Element result = 0;
    // insert code here...
    T_link *s=NULL;
    s=pInitLink();
    if(s==NULL)
    {
        printf("s is NULL\n");
    }
    
    flag = push(s, 1, 1);
    printf("push %d result %d\n", 1, flag);
    flag = push(s, 2, 2);
    printf("push %d result %d\n", 2, flag);
    flag = push(s, 3, 500);
    printf("push %d result %d\n", 500, flag);
    flag = push(s, 1, 501);
    printf("push %d result %d\n", 501, flag);

    flag = ergodic(s);
    printf("ergodic result is %d, link size %d\n", flag, s->size);
    
    flag = delete(s, 1);
    printf("delete result is %d, link size %d\n", flag, s->size);
    
    flag = ergodic(s);
    printf("ergodic result is %d, link size %d\n", flag, s->size);

    result = query(s, 1);
    printf("query result is %d, link size %d\n", result, s->size);

    return 0;
}

link.h文件

//
//  link.h
//  learn
//
//  Created by shang wang on 2021/7/10.
//

#ifndef link_h
#define link_h

#include <stdio.h>

typedef int Element;

typedef enum{
    false,
    true,
}Status;

typedef struct node{
    Element data;
    struct node *pNext;
}T_node, *P_node;

typedef struct link{
    T_node *head;
    Element size;
}T_link, *P_link;

//单链表创建
T_link *pInitLink(void);

//单链表插入
Status push(T_link *pLink, int n, Element value);

//单链表顺序遍历
Status ergodic(T_link *pLink);

//链表删除
Status  delete(T_link *pLink, int n);

//链表查询
Element query(T_link *pLink, int n);
#endif /* link_h */

link.c文件

//
//  link.c
//  learn
//
//  Created by shang wang on 2021/7/10.
//  单链表创建 插入 删除 查询 遍历 翻转 合并 检测环  删除倒数第几个节点  求链表中间点  求有没有环

#include "link.h"
#include "stdio.h"
#include <stdlib.h> //malloc

//工具函数

//单链表创建,使用了头结点,头结点是第一个节点。插入第一节点位置无前驱节点,特殊处理。
T_link *pInitLink()
{
    T_link *pLink = (T_link *)malloc(sizeof(T_link));
    if(pLink == NULL){
        return NULL;
    }
    
    T_node *pNode = (T_node *)malloc(sizeof(T_node));
    if (pNode == NULL) {
        return NULL;
    }
    
    pNode->data=0;
    pNode->pNext=NULL;
    pLink->size=1;                  //第一个节点使用
    pLink->head=pNode;
    
    return pLink;
}

//单链表插入
Status push(T_link *pLink, int n, Element value)
{
    int i=1;
    
    if(pLink==NULL||n<1){
        return false;
    }
    
    if(n<1||n>pLink->size){
        n=pLink->size;
    }
    
    T_node *pCurrent=pLink->head;
    while (i < (n-1)) {                 //头结点被使用,头结点无前驱节点。计算前驱节点的for循环终止条件减1
        pCurrent = pCurrent->pNext;
        i++;
    }
    
    T_node *pNewNode = (T_node *)malloc(sizeof(T_node));
    if(pNewNode == NULL){
        return false;
    }
//    printf("%d\n", pNewNode);
    if (n==1) {
        pNewNode->pNext=pCurrent;
        pLink->head=pNewNode;              //插入链表头部,即第一个节点
    }else{
        pNewNode->pNext=pCurrent->pNext;
        pCurrent->pNext=pNewNode;       //插入链表其他位置
    }
    pNewNode->data=value;
    pLink->size++;
    
    return true;
}

//单链表顺序遍历
Status ergodic(T_link *pLink)
{
    int i=0;
    
    if(pLink==NULL||pLink->size==0)
    {
        printf("link is NULL or link is Emty\n");
        return false;
    }
    
    T_node *pCurrent=pLink->head;
    for (i=0;i<pLink->size;i++) {
        printf("No.%d is %d\n",i+1, pCurrent->data);
        pCurrent=pCurrent->pNext;
    }
    
    return true;
}

//链表删除
Status  delete(T_link *pLink, int n)
{
    int i=1;
    if (pLink==NULL||n<1) {
        return false;
    }
    T_node *pCurrent=pLink->head;
    while (i<(n-1)) {
        pCurrent=pCurrent->pNext;
        i++;
    }
    
    T_node *pTempNode = NULL;
    if (n==1) {
        pTempNode = pCurrent;
        pLink->head=pTempNode->pNext;
    }else{
        pTempNode = pCurrent->pNext;
        pCurrent->pNext=pTempNode->pNext;
    }

    pLink->size--;
    free(pTempNode);
    return true;
}

//链表查询
Element query(T_link *pLink, int n)
{
    int i=1;
    if(pLink==NULL||n<1)
    {
        return false;
    }
    T_node *pCurrent=pLink->head;
    while (i<(n-1)) {
        pCurrent=pCurrent->pNext;
        i++;
    }
    if (n==1) {
        return pCurrent->data;
    }else{
        return pCurrent->pNext->data;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坏一点

您的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值