关于C语言的指针、链表的原理和各类操作
今天课上我们老师为我们讲述了c语言的指针、链表的原理以及各类操作。
一、指针
1、指针
指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。
2、数组
C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象。数组和指针不是同一种结构因此不可以互相转换。而数组变量指向了数组的第一个元素的内存地址。
3、指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址。与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型。
我们在使用c语言进行编写程序的时候,就一定会使用上指针,指针的操作是编写程序的一个点。如何更好的使用指针,将是我们进行更好的书写程序的关键。我认为弄清楚下面几个要点,可以更好的理解指针:
1:指针是一个地址,指向的是个类型
2:指针指向的是地址,地址指向的是内容
3:指针的指针,是面对于指针的变量
二、链表
链表我的理解要包含以下特征:(1).由n个节点离散分配;(2).每个节点通过指针连接(3)每一个节点由一个前驱节点和一个后驱节点(4).首节点没有前驱节点,尾节点没有后驱节点;
满足上面的4条,我们就称为链表;链表既然由很多个节点,那节点又由什么组成?节点由两个部分组成,一是数据域,用来存放有效数据;二是指针域,用来指向下一个节点;下面用C语言来构建链表数据结构,首先应该构造出节点,然后再把所有的节点连起来,就构成了链表;
我认为学生宿舍的管理系统中,指针的作用就是使其保存到下一个地址
下面是单链表的学生信息管理系统
#include "string.h"
#include "sys/malloc.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
#include "sys/types.h"
#define MAXSIZE 100
typedef struct Student
{
char sname[9];
char sno[5];
int score;
}DataType;
typedef struct
{
DataType data;
struct Node *next;
}LinkList;
LinkList * inputdata();
void display(LinkList * p);
//遍历链表
void displayAll(LinkList * L);
//插入
LinkList * createTailList();//尾插
LinkList * createHeadList();//头插
//查询
void getElem(LinkList * L, int i);//按序号
void locateElemBysno(LinkList * L, char ch[]);//按值
void locateElemBysname(LinkList * L, char ch[]);
int lengthList(LinkList * L);
//插入
void insertElem(LinkList * L, int i);//在第i个结点前进行插入
void insertElemBysno(LinkList * L, char ch[5]);//按学号
void deleteElem(LinkList * L, char ch[]);
//排序
void insertSort(LinkList * L);
int menue();
int main(int argc,char *argv[])
{
LinkList *L;
char sno[5] = {'\0'};
char sname[9] = {'\0'};
int b = 1;
int i = 1;
while (b) {
switch(menue())
{
case 1:
L = createTailList();
//L = createHeadList();
break;
case 2:
//displayAll(L);
printf("\t◎输入插入哪个位置前:");
scanf("%d", &i);
insertElem(L, i);
//scanf("%s", sno);
//insertElemBysno(L, sno);
break;
case 3:
printf("\t◎输入待删除学生的学号:");
scanf("%s", sno);
deleteElem(L, sno);
break;
case 4:
printf("╭═══════════════════════════════╮\n");
printf("║\t学生总数为:%d\t\t║\n", lengthList(L));
printf("╰═══════════════════════════════╯\n\n");
break;
case 5:
printf("\t◎输入待查找学生的学号:");
scanf("%s", sno);
locateElemBysno(L, sno);
break;
case 6:
printf("\t◎输入待查学生的位置:");
scanf("%d", &i);
getElem(L, i);
break;
case 7:
displayAll(L);
break;
case 8:
insertSort(L);
break;
case 9:
i = 2;
while (i)
{
system("clear");
printf("\033[5m");
printf("\033[?25l"); //隐藏光标
printf("\n\n\n\n\n\n");
printf("╭═══════════════════════════════╮\n");
printf("║\t正在退出(%d秒)\t\t║\n", i--);
printf("╰═══════════════════════════════╯\n");
sleep(1);
}
printf("\033[0m");
system("clear");
return 0;
break;
default:
i = 2;
while (i)
{
system("clear");
printf("╭═══════════════════════════════╮\n");
printf("║操作数无效,正在返回主菜单(%d秒)║\n", i--);
printf("╰═══════════════════════════════╯\n");
sleep(1);
}
continue;
}
getchar();
printf("PRESS ENTER TO CONTINUE!");
while (1) {
if ('\n' == getchar())
{
break;
}
}
}
return 0;
}
int menue()
{
system("clear");
//警告音
printf("\033[0m"); //关闭所有属性
printf("\033[44;37m"); //47是字背景颜色,33是字体的颜色
printf ("\033[5m"); //闪烁
printf("\n^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n\n");
printf("\033[0m"); //关闭所有属性
printf("\033[44;37m");
printf("╭═══════════════════════════════╮\n");
printf("║\t学生成绩管理程序\t║\n");
printf("║\t\t\t\t║\n");
printf("║\t<1>创建\t\t\t║\n");
printf("║\t<2>指定位置后插入\t║\n");
printf("║\t<3>按位置删除\t\t║\n");
printf("║\t<4>求学生总数\t\t║\n");
printf("║\t<5>按学号查找\t\t║\n");
printf("║\t<6>按位置查找\t\t║\n");
printf("║\t<7>显示所有学生\t\t║\n");
printf("║\t<8>成绩排序\t\t║\n");
printf("║\t<9>退出\t\t\t║\n");
printf("╰═══════════════════════════════╯\n\n");
printf ("\033[5m");
printf("^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^\n\n");
printf("\033[0m"); //关闭所有属性
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
//printf ( "\t\007%s", asctime (timeinfo) );
printf ("\033[;34m");
printf ("\t[%4d-%02d-%02d %02d:%02d:%02d]\n",
1900+timeinfo->tm_year,
1+timeinfo->tm_mon,
timeinfo->tm_mday,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
char colorname[3][20] = {{"RED"}, {"BLUE"}, {"YELLLOW"}};
srand(time(&rawtime)); //时间触发
//textcolor(colorname[rand()%3]);
//printf("\t[textcolor is %s]\n", colorname[rand()%3]);
//颜色码和控制码 我的参考链接 http://wenku.baidu.com/view/a38f77ff910ef12d2af9e70b.html
printf("\t◎输入功能项:");
int a = 0;
scanf("%d",&a);
printf("\033[0m");
system("clear");
return a;
}
LinkList * inputdata()
{
LinkList *s = NULL;
char sno[5] = {'\0'};
char sname[9] = {'\0'};
int score = 0;
printf("\tsno\t->");
scanf("%s", sno);
if (sno[0] == '#') {
return s;
}
s = (LinkList *)malloc(sizeof(LinkList));
strcpy(s -> data.sno, sno);
printf("\tsname\t->");
scanf("%s", sname);
strcpy(s -> data.sname, sname);
printf("\tscore\t->");
scanf("%d", &score);
s -> data.score = score;
printf("\n");
return s;
}
void display(LinkList * p)
{
printf("╭═══════════════════════════════════════════════╮\n");
printf("║\tsno\t\tsname\t\tscore\t║\n");
printf("║\t%s\t\t%s\t\t%-4d\t║\n", p->data.sno, p->data.sname, p->data.score);
printf("╰═══════════════════════════════════════════════╯\n\n");}
void displayAll(LinkList * L)
{
printf("╭═══════════════════════════════════════════════╮\n");
printf("║\tsno\t\tsname\t\tscore\t║\n");
LinkList * p = L -> next;
while(p)
{
printf("║\t%s\t\t%s\t\t%-4d\t║\n", p->data.sno, p->data.sname, p->data.score);
p = p -> next;
}
printf("╰═══════════════════════════════════════════════╯\n\n");
}
LinkList * createTailList()
{
//链表头结点
LinkList * L = (LinkList *)malloc(sizeof(LinkList));
//结点
LinkList * s = NULL;
//尾结点
LinkList * r = L;
printf("╭═══════════════════════════════════════════════╮\n");
printf("║\t\t尾插法建立\t\t\t║\n");
printf("║\t请输入学生信息(当学号为\"#\"时结束)\t║\n");
printf("║\t\t\t\t\t\t║\n");
printf("║\t学号sno (不超过4位)\t\t║\n");
printf("║\t姓名sname (不超过4个汉字)\t\t║\n");
printf("║\t成绩score (int型)\t\t\t║\n");
printf("╰═══════════════════════════════════════════════╯\n\n");
while (1) {
s = inputdata();
if (!s) {
break;
}
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
LinkList * createHeadList()
{
//链表头结点
LinkList * L = (LinkList *)malloc(sizeof(LinkList));
//结点
LinkList * s = NULL;
printf("╭═══════════════════════════════════════════════╮\n");
printf("║\t\t头插法建立\t\t║\n");
printf("║\t请输入学生信息(当学号为\"#\"时结束)\t║\n");
printf("║\t\t\t\t\t\t║\n");
printf("║\t学号sno (不超过4位)\t\t║\n");
printf("║\t姓名sname (不超过4个汉字)\t\t║\n");
printf("║\t成绩score (int型)\t\t\t║\n");
printf("╰═══════════════════════════════════════════════╯\n\n");
while (1) {
s = inputdata();
if (!s) {
break;
}
s->next = L->next;
L->next = s;
}
return L;
}
void getElem(LinkList * L, int i)
{
LinkList * p = L;
int j = 0;
while (p && j<i) {
p = p->next;
j++;
}
if (!p) {
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
else
{
display(p);
}
}
void locateElemBysno(LinkList * L, char ch[5])
{
LinkList * p = L->next;
while (p && (0 != strcmp(p->data.sno, ch)))
{
p = p -> next;
}
if (!p) {
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
else
{
display(p);
}
}
void locateElemBysname(LinkList * L, char ch[9])
{
LinkList * p = L->next;
while (p && (0 != strcmp(p->data.sname, ch)))
{
p = p -> next;
}
if (!p) {
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
else
{
display(p);
}
}
int lengthList(LinkList * L)
{
LinkList * p = L->next;
int j = 0;
while (p) {
p = p->next;
j ++;
}
return j;
}
void insertElem(LinkList * L, int i)
{
LinkList * s = inputdata();
LinkList * p = L;
int j = 0;
while (p && j<i-1)
{
p = p->next;
j++;
}
if (p && p->next)
{
s->next = p->next;
p->next = s;
}
else
{
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
displayAll(L);
}
void insertElemBysno(LinkList * L, char ch[5])
{
LinkList * p = L;
LinkList * s = NULL;
while (p && (0 != strcmp(p->data.sno, ch)))
{
p = p->next;
}
if (!p) {
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
else
{
s = inputdata();
s->next = p->next;
p->next = s;
}
}
void deleteElem(LinkList * L, char ch[5])
{
LinkList *p, *q;
p = L->next;
q=L;
while (p && (strcmp(p->data.sno, ch) != 0)) {
q = p;
p = p->next;
}
if (!p) {
printf("╭═══════════════════════════════╮\n");
printf("║\tDon't find the student!\t║\n");
printf("╰═══════════════════════════════╯\n\n");
}
else
{
display(p);
q->next = p->next;
free(p);
}
}
void insertSort(LinkList * L)
{
LinkList * L1;
LinkList * p;
LinkList * q;
LinkList * s;
int len;
len = lengthList(L);
L1 = (LinkList *)malloc(sizeof(LinkList));
if (L->next) {
s = (LinkList *)malloc(sizeof(LinkList));
strcpy(s->data.sno, L->data.sno);
strcpy(s->data.sname, L->data.sname);
s->data.score = L->data.score;
s->next = NULL;
L1->next = s;
q = L->next;
}
else
{
printf("╭═══════════════════════════════════╮\n");
printf("║\tThe student link list is empty!\n║\n");
printf("╰═══════════════════════════════════╯\n\n");
return;
}
while (q) {
p = L1->next;
while (p &&(p->data.score >= q->data.score))
{
p = p->next;
}
s = (LinkList *)malloc(sizeof(LinkList));
strcpy(s->data.sno, q->data.sno);
strcpy(s->data.sname, q->data.sname);
s->data.score = q->data.score;
if (!p) {
s->next = NULL;
p->next = s;
}
else
{
s->next = p->next;
p->next = s;
}
q = q->next;
}
displayAll(L1);
}
转载于:https://blog.51cto.com/11521002/1771774
关于C语言的指针、链表的原理和各类操作相关推荐
- C语言的指针、链表的原理和各类操作
心得体会: 堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的.然而要使用c语言这个工具解决实际问题,又必须掌握它.通过多次上机练习,对于语法知识有了感性的认识, ...
- 关于学习C语言的指针、链表的原理和各类操作的体会
要与实际联系起来,链表就想象成一个火车,一个车厢就是一个节点. 总之,要先知道他的原理,原理是最重要的,编程其次 其次,链表得使用较静态数组灵活,因此它对使用者要求也较高,我觉得指针得使用最重要,千万 ...
- C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻
一.前言 二.变量与指针的本质 三.指针的几个相关概念 四.指向不同数据类型的指针 五.总结 一.前言 如果问C语言中最重要.威力最大的概念是什么,答案必将是指针!威力大,意味着使用方便.高效,同时也 ...
- C语言指针-从底层原理到花式技巧,图文和代码给你讲解透彻
作者 | 道哥 责编 | 张文 头图 | CSDN 下载自东方 IC 前言 如果问 C 语言中最重要.威力最大的概念是什么,答案必将是指针! 威力大,意味着使用方便.高效,同时也意味着语法复杂.容易 ...
- 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...
的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...
- 聊聊C语言和指针的本质
大家好,今天我们聊一聊C语言的指针. 来源:https://blog.csdn.net/dog250/article/details/103221309 很多编程语言都以 "没有指针&quo ...
- C语言和指针的本质是什么?技术大神给出答案
很多编程语言都以 "没有指针" 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的. 那么,什么是指针,为什么大家都想避开指针. 很简单, 指针就是地址,当一个地址作为一个 ...
- 易语言多级指针读取_C语言指针难吗?纸老虎而已,纯干货讲解(附代码)
作者:21IC网络整理,排版:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方 ...
- java什么时候用链表_java链表的原理及使用方法
链表是一种物理存储单元上非连续.非顺序(即每个数据对象data存放的位置可以是非连续.非顺序的)的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表中每一个元素称为结点,结点可以在运 ...
最新文章
- Linux命令 crontab的理解和使用方法
- XamarinAndroid组件教程RecylerView动画组件使用动画(3)
- 广东省一本大学哪些学计算机,2020年广东省内一本大学有哪些(一本大学一览表)...
- 入门视频采集与处理(学会分析YUV数据)
- vue笔记整理与总结
- error response from daemon_Scrapy 框架-模拟登录-Request、Response
- Boost:bind绑定的==,!=,<,<=,>,> =运算符的测试程序
- Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis
- 《DSP using MATLAB》示例Example4.2
- Atitit spring springboot 集成mybatis法 目录 1.1. 使用spring管理数据源。。需要修改spring、 配置	1 1.2. 直接代码集成,无需修改任何配置	1
- 【译】2018 年前端开发回顾
- 成都天府机场附近哪里停车便宜,成都天府机场停车攻略
- Markdown 笔记神器 Typora 如何上传本地图片(图床功能)?
- linux比windows丑,告别 Windows 难看难用,教你打造体验不输 macOS 和 Linux 的终端
- Java之编写FlyBird小游戏
- 重构改善既有代码设计
- 如何用C语言开发图形化游戏
- TinyOS总体介绍
- 加载.npz文件时,出现错误:OSError: Failed to interpret file ‘xxx.npz‘ as a pickle
- Skyline WEB端开发3——添加一个弹框