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

  1 //这是C语言的写法,但会报错,原因是len(当前的节点长度)
  2 //无法在insert(插入)和deleted(删除)之后改变
  3 //不能使用delete是因为delete是C++中的一个运算符
  4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 typedef int ElementType;
  8 typedef struct node {
  9     ElementType data;
 10     struct node *pNext;//指向下一个结点的指针
 11 }Node, *pNode;//这里NODE等价于struct node、、PNODE等价于struct Node*
 12
 13 pNode Create_List(int len);
 14 pNode change(pNode pHead,int len);
 15 void ergodic(pNode pHead,int len);
 16 pNode insert(pNode pHead,int *len);
 17 int main() {
 18     pNode pHead = NULL;//创建一个头结点
 19     int len;//用来存放有效节点字数
 20     printf("请输入节点个数:");
 21     scanf("%d", &len);
 22     pHead = Create_List(len);//创建一个单链表,并将该链表的头指针赋值给pHead
 23     pNode p;//创建一个移动指针,指向需要访问的结点
 24
 25
 26     ergodic(pHead,len);//遍历数据输出
 27     p = change(pHead,len);//修改节点的数据
 28     ergodic(pHead,len);//遍历数据输出
 29     p = insert(pHead,&len);//插入一个节点
 30     printf("此时len为:%d", len);
 31     printf("\n插入成功\n");
 32     ergodic(pHead,len);//遍历数据输出
 33     return 0;
 34 }
 35
 36
 37
 38 pNode Create_List(int len)//这里用PNODE表示返回一个结构体类型的指针
 39 {
 40     //创建链表
 41
 42     pNode pHead = (pNode)malloc(sizeof(Node));//分配一个不存放有效数据的头的头结点
 43                                               //malloc返回的是一个节点,其中 (结构体类型的指针)malloc(sizeof(结构体的名称))
 44     pNode pTail = pHead;//定义一个尾指针,并初始化
 45     pTail->pNext = NULL;//将尾节点指针置空
 46
 47     int i;
 48     int val;
 49     for (i = 0; i<len; i++) {
 50         printf("输入第%d个节点的数值:", i + 1);
 51         scanf("%d", &val);
 52         pNode pNew = (pNode)malloc(sizeof(Node));
 53         //给下一个节点分配空间
 54         pNew->data = val;//1.先把值赋给下一个结点
 55         pTail->pNext = pNew;//新的节点的指针域pTail的指针域
 56         pNew = NULL;//把为节点的指针域置空
 57         pTail = pTail->pNext;//将尾指针+1指向最后一个节点
 58     }
 59     return pHead;//返回一个链表的头指针
 60 }
 61 //++++++++++++++++++++++++++++++
 62 void ergodic(pNode pHead, int len) {
 63     //遍历数据输出
 64     pNode p;
 65     p = pHead;//将移动指针指向头结点
 66     int j;
 67     for (j = 0; j<len; j++) {
 68         p = p->pNext;
 69         printf("第%d个节点的数值是:%d\n", (j + 1), p->data);
 70     }
 71 }
 72
 73 //++++++++++++++++++++++++++++++
 74 pNode change(pNode pHead, int len) {
 75     //修改节点的数据
 76     pNode p;
 77     p = pHead;
 78     int value;
 79     printf("修改节点的数据\n");
 80     int k;
 81     for (k = 0; k<len; k++) {
 82         p = p->pNext;
 83         printf("输入第%d个结点要修改的数据:", k + 1);
 84         scanf("%d", &value);
 85         p->data = value;
 86     }
 87     return pHead;
 88 }
 89 //+++++++++++++++++++++++++++++
 90 //插入节点
 91 pNode insert(pNode pHead, int *len) {
 92     pNode p;
 93     p = pHead;
 94     printf("输入在第几个节点(头结点不算)后插入:");
 95     int m;
 96     scanf("%d", &m);
 97     int i;
 98     for (i = 0; i<m; i++) {
 99         p = p->pNext;
100     }
101     pNode e = (pNode)malloc(sizeof(Node));
102     e->pNext = NULL;
103     printf("请输入该节点的数值:");
104     int n;
105     scanf("%d", &n);
106     e->data = n;
107     e->pNext = p->pNext;
108     p->pNext = e;
109     len++;
110     return pHead;
111 }
112 //+++++++++++++++++++++++++++++++
113 //+++++++++++++++++++++++++++++
114     //删除节点
115     pNode delete(pNode pHead,int len){
116         pNode p;
117         pNode q;
118         p=pHead;
119         printf("请输入要删除第几个节点(不包含头结点)");
120         int k;
121         scanf("%d",&k);
122         int i;
123         for(i=0;i<k-1;i++){
124             p=p->pNext;
125         }
126         q=p->pNext;
127         p->pNext=q->pNext;
128         free(q);
129         q=NULL;
130         return pHead;
131     }

原文地址:https://www.cnblogs.com/kangge/p/8316844.html

时间: 2024-10-10 11:01:38

注释最全的C语言链表的增删改查的相关文章

【C】利用单链表数据结构实现通讯录,链表的增删改查

C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现. 结构体中放一个指向后接节点的指针与每一个结点应该存放的信息. 下面做一个命令行的通讯录来说明链表的增删改查这个问题. 一开始让用户输入链表,按1可以输出,按3可以删除. 可以修改: 可以插入. 按0则可以退出: 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Linklist{ char name[10];//存放名字 char num[10];

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

Java描述数据结构之链表的增删改查

链表是一种常见的基础数据结构,它是一种线性表,但在内存中它并不是顺序存储的,它是以链式进行存储的,每一个节点里存放的是下一个节点的"指针".在Java中的数据分为引用数据类型和基础数据类型,在Java中不存在指针的概念,但是对于链表而言的指针,指的就是引用数据类型的地址. 链表和数组都是线性的数据结构,对于数组而言其长度是固定的,由于在内存中其是连续的,因此更适合做查找与遍历,而链表在内存中是并不是顺序存储的,但是由于其是通过"指针"构成的,因此在插入.删除时比较数

C++链表,增删改查

// //  main.c //  homework_linkList // //  Created by jiumiao on 15/7/23. //  Copyright (c) 2015年 jiumiao. All rights reserved. // #include <stdio.h> #include <stdlib.h> typedef struct _NPC{ char name[20]; int attack; int hp; }NPC; typedef str

不带头结点的链表的增删改查

这两天都在学习数据结构中的链表操作,觉得有很多东西想跟大家分享,通常写链表一般会创建一个带头结点的链表,带头结点链表非常容易的进行链表的遍历,而不带头结点的链表,一马虎就会指错,所以在这里跟大家分享下我进行没有头结点的创建时的心得! 1.创建无头结点链表(头插) 2.删除中间节点(不是第一个也不是最后一个) 1 #include<stdio.h> 2 #include<malloc.h> 3 typedef char ElemType; 4 typedef struct node

js 创建链表(增删改查)

话说面试又失败了,今年真是坎坷的一年,女朋友跑了,工作不顺,家里催婚,大学刚毕业,大公司不要.在这个没钱没人的年纪,有点小绝望.不多说直接上代码: /*======定义结构======*/ var node=function(element){ this.element=element this.next=null } var linkedList=function(){ this.head=new node("head") this.find=find this.insert=ins

用内部类实现链表的增删改查

public class 链表{ public static void main(String[] args){ NodeManager nm = new NodeManager(); System.out.println("---------------add---------------"); nm.add(5); nm.add(4); nm.add(3); nm.add(2); nm.add(1); nm.add(0); nm.print(); System.out.printl

Java 创建链表,增删改查

项目结构: Node.java: package linkedList; public class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } } LinkedList.java: package linkedList; public class LinkedList { private Node first; //指向第一个节点(默认为null) privat

Java实现单向链表的增删改查

class Node { public int val; public Node next; public Node(int val) { this.val = val; } } class ListHead { public int count ; public Node next; public ListHead() { this.count = 0; this.next = null; } } class List { public ListHead head; private Node