文档章节

c语言的结构体与单链表的创建和使用

老翻车司机
 老翻车司机
发布于 2016/04/10 10:47
字数 562
阅读 91
收藏 2

周末闲来无事,就重温了一下结构体和指针,不过概念都差不多忘光了。查了好些个资料才写完这个小小的例子,希望能给刚学习的同学们一些帮助,同事也希望老司机们给些指点。闲话不多说,直接上代码吧。ps:该代码是在xcode中写的,不知道win中会不会有影响,linux中应该没问题。

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

//第一种 有结构体名,可以使用结构体名来定义变量 例如 struct node a;
struct a{
    int a;
};
//第二种 没有结构体名,直接定义变量 ,如果要定义新的变量,必须写在所定义的结构体后面
struct {
    int a;
} b;

//链表节点
struct node{
    struct node* next;
    int a;
} ;

//使用typedef 为node结构体取一个别名
typedef struct node NODE;

//链表的第一个节点
NODE* first = NULL;
//链表的最后一个节点
NODE* last = NULL;
//链表的长度
int size = 0;

NODE* createNode() {
    NODE* n = (NODE*) malloc(sizeof(NODE));
    return n;
}


//向链表的末尾添加一个节点
void add(NODE* n) {
    NODE* temp;
    if (first == NULL) {
        first = createNode();
        first = n;
    } else {
        temp = createNode();
        temp = last;
        temp->next = createNode();
        temp->next = n;
    }
    last = n;
    ++size;
}

//打印整个链表
void print(NODE* h) {
    if (h != NULL) {
        NODE* n = createNode();
        n = h->next;
        while (n != NULL){
            printf("%-4d",n->a);
            n = n->next;
        }
    }
    printf("\n");
}

//初始化链表,len则是要生成链表的长度
NODE* init(int len) {
    NODE* head = NULL;
    int i = 0;
    while (i <= len) {
        NODE* n = createNode();
        n->next = NULL;
        n->a = i;
        if (head == NULL) {
            head = createNode();
            head->next = n;
        }
        add(n);
        i++;
    }
    return head;
}

int main(int argc, const char * argv[]) {
    //链表的头节点 一般该节点都不保存数据只保存一个节点的地址。
    NODE* head = init(10);
    printf("first value %-4d\n",first->a);
    printf("last value %-4d\n",last->a);
    printf("=======================\n");
    print(head);
    printf("%-4d\n",size);
    free(head);
    
}

NODE* init(int len)

上面本来这句是想用

void init(NODE* head, int len)

结果调用 init 后 head 依然是NULL,可能是因为head这块内存是在init函数中申请的,当函数执行完后这块内存销毁了所造成的。

© 著作权归作者所有

老翻车司机
粉丝 8
博文 6
码字总数 1266
作品 0
深圳
程序员
私信 提问
基本数据结构 -- 链表的遍历、查找、插入和删除单

  本文将使用 C 语言来实现一个单链表,并实现遍历、查找、插入、删除等操作。 一、创建一个单链表   首先,定义一个存放结点相关信息的结构体,结构体有两个元素,分别是键值和一个指向...

tongye
04/23
0
0
feof和EOF的字符被重复读取问题的思考

void main(){ PNode pNode; FILE *fp=fopen("1.txt","r"); pNode=Create(i); while(getc(fp)!=EOF) { int i; fscanf(fp,"%d",&i); pNode=Add(i,pNode); } fclose(fp); Print(pNode);} (问题......

断桥残雪断桥残雪
2015/05/17
453
0
数据结构与算法-C语言篇7-链式存储结构之静态链表

数据结构与算法-目录 前言    C语言具有指针能力,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加方便灵活。 后来的面向对象语言,如Java、C#等,虽不使用指针,但因为...

香沙小熊
2018/01/09
0
0
数据结构java(一)数组链表

链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。 相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存。 所以只...

dark_Souls
02/12
0
0
线性表Linear List-线性表的链式表示和实现

线性表(Linear List) 线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列 其中: 数据元素的个数n定义为表的长度 = "list".length() ("list...

秋风醉了
2014/05/06
91
0

没有更多内容

加载失败,请刷新页面

加载更多

数据流中的中位数

吐出的较小的N/2 个,都在大根堆里,较大的 N/2 个,都在小根堆里。 此时 5、4,都在大根堆,小根堆没有数。 此时应该从大根堆的堆顶弹出来,扔到小根堆里。 比如:先把 5 拿出来,再把堆最后...

Garphy
9分钟前
3
0
微服务下配置管理中心 SCCA

SCCA 简介 SCCA 全称 spring-cloud-config-admin,微服务下 Spring Boot 应用(包含 Spring Cloud)统一的配置管理平台。 Github 地址:spring-cloud-config-admin 核心贡献者:程序员DD | ...

SpringForA
11分钟前
4
0
spring 是如何注入对象的和bean 创建过程分析

文章目录: beanFactory 及 bean 生命周期起步 BeanFactory refresh 全过程 BeanFactoryPostProcessor 和 BeanPostProcessor 解析 使用 BeanPostProcessor 实现 aop 和 springboot Cache 相关......

sanri1993
14分钟前
8
0
@PathVariable使用

public interface ProductInfoRepository extends JpaRepository<ProductInfo, String>{ List<ProductInfo> findByProductId(String productId);} ProductInfoController @Autowired ......

观海562
25分钟前
6
0
利用CSS禁止手机长按出现气泡: 复制、选择等功能

可以用 * ,也可作用于一个div div{  -webkit-touch-callout:none;  /*系统默认菜单被禁用*/  -webkit-user-select:none; /*webkit浏览器*/  -khtml-user-select:none; /*早期浏览...

蓝小驴
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部