C语言单链表

链表CURD操作详解
/**
 * @todo    c链表操作:CURD
 * @author Koma
 **/
#include<stdio.h>
#include<stdlib.h>
 
typedef struct node{
    int data;
    struct node *next;
}LNode, *LinkList;
 
/**
 * 初始化并创建一个带头节点的链表
 **/
LinkList init( int len ) {
    int i;
    LinkList p, r, list;
    list = (LinkList)malloc(sizeof(LNode));
    list->next = NULL;
    for ( i = 0; i < len; i++ ) {
        p = (LinkList)malloc(sizeof(LNode));
        p->data = i+1;
        p->next = NULL;
        if ( !list->next ) {
            list->next = p;  //赋值头节点
        } else {
            r->next = p;
        }
        r = p;  //移动r指针,指向下一个节点
    }
    return list;
}
 
/**
 * 插入元素
 * @param int n 插入的位置
 * @param int e 插入的值
 **/
void insertEle( LinkList l, int n, int e ) {
    LinkList p, q, ele;
    int i = 1;
    ele = (LinkList)malloc(sizeof(LNode));
    ele->data = e;
    ele->next = NULL;
    p = q = l->next;
     
    if ( n == 1 ) {         //将元素添加到链表头
        l->next = ele;
        ele->next = q;
        return;
    }
    while ( i != n && q->next != NULL ) {
        p = q;
        q = q->next;
        i++;
    }
    if ( i == n ) {
        p->next = ele;
        ele->next = q;
    } else if( i < n ) { //将元素添加到链表尾
        q->next = ele;
    }
}
 
/**
 * 删除节点
 * @param int n 欲删除节点的位置
 **/
void delNode( LinkList l, int n ) {
    LinkList p, q;
    int i = 1;
    p = q = l->next;
    if ( n == 1 ) {
        l->next = q->next;
    } else {
        while ( i != n && q->next != NULL ) {
            p = q;
            q = q->next;
            i++;
        }
        if ( i == n ) {
            p->next = q->next;
        }
    }
}
 
/**
 * 修改节点
 * @param int n 欲修改节点的位置
 * @param int e 修改值
 **/
void updateNode( LinkList l, int n, int e ) {
    LinkList q;
    int i = 1;
    q = l->next;
    while ( i != n && q->next != NULL ) {
        q = q->next;
        i++;
    }
    if ( i == n ) {
        q->data = e;
    }
}
 
/**
 * 打印链表 
 **/
void printLink( LinkList l ) {
    LinkList q;
    q = l->next;
    while ( q->next != NULL ) {
        printf("%d ", q->data);
        q = q->next;
    }
    printf("%d\n", q->data); //打印最后一个元素
}
 
int main() { 
        LinkList l;
    l = init(5);
    printLink(l);
    insertEle(l, 6, 10);
    printLink(l);
    delNode(l, 2);
    printLink(l);
    updateNode(l, 6, 22);
    printLink(l);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值