关于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);

}

时间: 2024-07-31 18:14:21

关于C语言的指针、链表的原理和各类操作的相关文章

马兴150809305C语言的指针、链表的原理和各类操作

一.指针 1.运用指针 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&

C语言的指针、链表的原理和各类操作

心得体会: 堂上要讲授许多关于c语言的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的.然而要使用c语言这个工具解决实际问题,又必须掌握它.通过多次上机练习,对于语法知识有了感性的认识,加深对它的理解,在理解的基础上就会自然而然地掌握c语言的语法规定.对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,这是由于大部分学生是初次接触程序设计,缺乏程序设计的实践所致.学习c语言不能停留在学习它的语法规则,而是利用学到的知识编写c语言程序,解决实际问题.即把c语言作为工

关于学习C语言的指针、链表的原理和各类操作的体会

要与实际联系起来,链表就想象成一个火车,一个车厢就是一个节点. 总之,要先知道他的原理,原理是最重要的,编程其次 其次,链表得使用较静态数组灵活,因此它对使用者要求也较高,我觉得指针得使用最重要,千万不能乱指,否则很容易发生内存得存取错误,这样得错误较恐怖.

就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会

一.指向结构体变量的指针变量 指向结构体变量的指针变量的定义形式与一般指针变量的定义形式相同,只是将其指向类型定义为结构体类型即可.例如:        struct person            { charname[20];             char sex;             int age;             float height;            };       struct person *p;则指针变量p,它可以指向struct person类

指针、链表的原理和各类操作相关心得以及学生信息管理系统

伴随着学期末的到来,C语言程序设计这门课也接近尾声.经过前两次的教学,我们对C语言也有了深刻的了解,学习的内容也不断的加深.这次我们就学习了C语言程序设计里应用最广泛,也是最难学习的知识--链表和指针的应用. 关于指针和链表这两个的应用和上次的管理系统有着直接的关系,没有添加链表和指针的管理系统无法做到精确的查找.数据存储方面也显得不方便.所以指针和链表的作用能够直接指向你所需要的数据地址,使程序更加完善.这次我就利用指针的应用制作了一个管理员工工资等信息的程序. §1 指向结构体变量的指针变量

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

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

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type