注释最全的C语言链表的增删改查

//这是C语言的写法,但会报错,原因是len(当前的节点长度)
//无法在insert(插入)和deleted(删除)之后改变
//不能使用delete是因为delete是C++中的一个运算符
//最终我把改程序用C++写了一遍,运用引用将len的真实值改变了
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct node {
    ElementType data;
    struct node *pNext;//指向下一个结点的指针
}Node, *pNode;//这里NODE等价于struct node、、PNODE等价于struct Node*

pNode Create_List(int len);
pNode change(pNode pHead,int len);
void ergodic(pNode pHead,int len);
pNode insert(pNode pHead,int *len);
int main() {
    pNode pHead = NULL;//创建一个头结点
    int len;//用来存放有效节点字数
    printf("请输入节点个数:");
    scanf("%d", &len);
    pHead = Create_List(len);//创建一个单链表,并将该链表的头指针赋值给pHead
    pNode p;//创建一个移动指针,指向需要访问的结点


    ergodic(pHead,len);//遍历数据输出
    p = change(pHead,len);//修改节点的数据
    ergodic(pHead,len);//遍历数据输出
    p = insert(pHead,&len);//插入一个节点
    printf("此时len为:%d", len);
    printf("\n插入成功\n");
    ergodic(pHead,len);//遍历数据输出
    return 0;
}



pNode Create_List(int len)//这里用PNODE表示返回一个结构体类型的指针
{
    //创建链表

    pNode pHead = (pNode)malloc(sizeof(Node));//分配一个不存放有效数据的头的头结点
                                              //malloc返回的是一个节点,其中 (结构体类型的指针)malloc(sizeof(结构体的名称))
    pNode pTail = pHead;//定义一个尾指针,并初始化
    pTail->pNext = NULL;//将尾节点指针置空

    int i;
    int val;
    for (i = 0; i<len; i++) {
        printf("输入第%d个节点的数值:", i + 1);
        scanf("%d", &val);
        pNode pNew = (pNode)malloc(sizeof(Node));
        //给下一个节点分配空间
        pNew->data = val;//1.先把值赋给下一个结点
        pTail->pNext = pNew;//新的节点的指针域pTail的指针域
        pNew = NULL;//把为节点的指针域置空
        pTail = pTail->pNext;//将尾指针+1指向最后一个节点
    }
    return pHead;//返回一个链表的头指针
}
//++++++++++++++++++++++++++++++
void ergodic(pNode pHead, int len) {
    //遍历数据输出
    pNode p;
    p = pHead;//将移动指针指向头结点
    int j;
    for (j = 0; j<len; j++) {
        p = p->pNext;
        printf("第%d个节点的数值是:%d\n", (j + 1), p->data);
    }
}

//++++++++++++++++++++++++++++++
pNode change(pNode pHead, int len) {
    //修改节点的数据
    pNode p;
    p = pHead;
    int value;
    printf("修改节点的数据\n");
    int k;
    for (k = 0; k<len; k++) {
        p = p->pNext;
        printf("输入第%d个结点要修改的数据:", k + 1);
        scanf("%d", &value);
        p->data = value;
    }
    return pHead;
}
//+++++++++++++++++++++++++++++
//插入节点
pNode insert(pNode pHead, int *len) {
    pNode p;
    p = pHead;
    printf("输入在第几个节点(头结点不算)后插入:");
    int m;
    scanf("%d", &m);
    int i;
    for (i = 0; i<m; i++) {
        p = p->pNext;
    }
    pNode e = (pNode)malloc(sizeof(Node));
    e->pNext = NULL;
    printf("请输入该节点的数值:");
    int n;
    scanf("%d", &n);
    e->data = n;
    e->pNext = p->pNext;
    p->pNext = e;
    len++;
    return pHead;
}
//+++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++
    //删除节点
    pNode delete(pNode pHead,int len){
        pNode p;
        pNode q;
        p=pHead;
        printf("请输入要删除第几个节点(不包含头结点)");
        int k;
        scanf("%d",&k);
        int i;
        for(i=0;i<k-1;i++){
            p=p->pNext;
        }
        q=p->pNext;
        p->pNext=q->pNext;
        free(q);
        q=NULL;
        return pHead;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值