使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。

静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。

动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表。

下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html

静态链表

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#include <stdio.h>
#include <stdlib.h>
/*所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。*/
struct Student
{
	int num;
	float score;
	struct Student *next;
};
int main()
{
	struct Student stu1, stu2, stu3, *head, *p;
	stu1.num = 1001; stu1.score = 80; //对结点stu1的num和score成员赋值
	stu2.num = 1002; stu2.score = 85; //对结点stu2的num和score成员赋值
	stu3.num = 1003; stu3.score = 90; //对结点stu3的num和score成员赋值

	head = &stu1;      //头指针指向第1个结点stu1
	stu1.next = &stu2; //将结点stu2的地址赋值给stu1结点的next成员
	stu2.next = &stu3; //将结点stu3的地址赋值给stu2结点的next成员
	stu3.next = NULL;  //stu3是最后一个结点,其next成员不存放任何结点的地址,置为NULL
	p = head;          //使p指针也指向第1个结点

	//遍历静态链表
	do{
		printf("%d,%f\n", p->num, p->score); //输出p所指向结点的数据
		p = p->next;                         //然后让p指向下一个结点
	} while (p != NULL);                     //直到p的next成员为NULL,即完成遍历

	system("pause");
}

动态链表

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#include <stdio.h>
#include <stdlib.h>
/*所谓动态链表,是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。*/
struct Student
{
	int No;//学号
	struct Student *next;
};
int main()
{
	struct Student *p1, *p2, *head;
	int n = 0; //结点个数
	head = NULL;
	p1 = (struct Student *)malloc(sizeof(struct Student));
	printf("请输入1个学号\n");
	scanf("%d", &p1->No);
	p2 = p1; //开始时,p1和p2均指向第1个结点
	while (p1->No != 0)
	{
		n++;
		if (n == 1)
		{
			head = p1;
		}
		else
		{
			p2->next = p1;
		}
		p2 = p1;//p2是最后一个结点
		printf("请输入学号,输入0终止:\n");
		p1 = (struct Student *)malloc(sizeof(struct Student));
		scanf("%d", &p1->No);
	};
	p2->next = NULL;//输入完毕后,p2->next为NULL

	//遍历动态链表
	struct Student *p;
	p = head;
	while (p != NULL)
	{
		printf("%d,", p->No);
		p = p -> next;
	}
	printf("\n");

	system("pause");
}

  

使用C语言描述静态链表和动态链表,布布扣,bubuko.com

时间: 2024-10-15 14:54:07

使用C语言描述静态链表和动态链表的相关文章

C语言中静态库和动态库笔记

库 库,故名思议,是存放东西的地方,其中存放的东西可以被多个人公用. 程序中借用库的概念,描述将代码进行抽取,这种代码被大多数程序使用, 其过程具有一定的模块化.封装.抽象的特征. 按照库的使用方式, 静态库 和 动态库. 不管怎样方式使用, 首先库的概念体现出代码逻辑上公共抽象. 有篇博文,做了介绍, 并有例子, 本文纯粹学习,借鉴了其中的例子. http://www.cnblogs.com/chio/archive/2007/11/03/948480.html 静态库 静态库,编译应用程序的

静态链表和动态链表

1. 静态链表 结构体中的成员可以是各种类型的指针变量,当一个结构体中有一个或多个成员的基类型是本结构体类型时,则称这种结构体为“引用自身的结构体”.如: struct link { char ch; struct link *p; } a; p是一个可以指向 struct link 类型变量的指针成员.因此,a.p = &a 是合法的表达式,由此构成的存储结构如图1所示. 图1 引用自身的结构体 例1 一个简单的链表 1 #include <stdio.h> 2 3 struct n

UNIX环境下用C语言写静态库与动态库

静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS 下的术语,但两者的概念是一样的.下面统一说静态库和动态库. 静态库,就是一大堆object (CC ,CC 在LINUX 下其实是软件链接到GCC 的,编译后默认为.o 结尾的)的集合.静态库就是用ar 等工具集合在一起.在编译的时候,连接器就会将这部分代码嵌入到目标代码里. 动态库,也是一大堆o

学习C/C++语言:结构体,动态链表

//*************************************************************** //结构体:简单的静态链表 #include<stdio.h> #include<string.h> #define NULL 0 #define SIZE 10 struct student { char num[SIZE]; float score; struct student *next; }; void main() { struct stu

动态语言和静态语言

动态语言Dynamically Typed Language例如:ECMAScript(JavaScript).Ruby.Python.VBScript.php也叫动态类型定义语言与静态类型定义相反,一种在执行期间才去发现数据类型的语言,动态语言是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.动态语言的类型检查是在运行时做的.它的优点是方便阅读,不需要写非常多的类型相关的代码:缺点是不方便调试,命名不规范时会造成读不懂,不利于理解等.目前java平台下的

嵌入式 Linux C语言(十)——静态库函数和动态库函数

嵌入式 Linux C语言(十一)--静态库函数和动态库函数 一.静态链接库 静态链接库是obj文件的一个集合,通常静态链接库以".a"为后缀,名字格式一般为libxxx.a,由程序ar生成.静态链接库是在程序编译过程中链接的,已经将调用的相关函数拷贝到程序内部,程序运行时和静态链接库已经没有任何关系. 1.静态链接库的创建 A.编写源码库文件 源码库文件一般包含.c和.h文件, hello.c文件: #include <stdio.h> void display(void

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

一.动态语言和静态语言1. 我们常说的动.静态语言,通常是指: 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 可能还有:动.静态编程语言 Dynamic\Statically Programming Language 2.    动态类型语言:在运行期间检查数据的类型的语言例如:Ruby\Python这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.Python是动态语言,变量只是对象的引用,变量a

编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别

一.编译型和解释型 我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码.这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler).如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了.但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织.这时编译各个文件时就会生成目标文件(Object  

静态单链表和动态单链表的区别

链表中结点的分配和回收是由系统提供的标准函数malloc和free动态实现的,称之为动态链表. 如果程序支持指针,则可按照我们的一般形式实现链表, 需要时分配,不需要时回收即可. 动态链表的空间是可以动态扩展的. typedef struct  node{ EleType data; struct node * pNext; }Node; 有些高级语言中没有"指针"数据类型,只能用数组来模拟线性链表的结构, 数组元素中的指针"域"存放的不是元素在内存中的真实地址,而