今天课上我们老师为我们讲述了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"

#defineMAXSIZE100

typedefstructStudent

{

charsname[9];

charsno[5];

intscore;

}DataType;

typedefstruct

{

DataTypedata;

structNode*next;

}LinkList;

LinkList*inputdata();

voiddisplay(LinkList*p);

//遍历链表

voiddisplayAll(LinkList*L);

//插入

LinkList*createTailList();//尾插

LinkList*createHeadList();//头插

//查询

voidgetElem(LinkList*L,inti);//按序号

voidlocateElemBysno(LinkList*L,charch[]);//按值

voidlocateElemBysname(LinkList*L,charch[]);

intlengthList(LinkList*L);

//插入

voidinsertElem(LinkList*L,inti);//在第i个结点前进行插入

voidinsertElemBysno(LinkList*L,charch[5]);//按学号

voiddeleteElem(LinkList*L,charch[]);

//排序

voidinsertSort(LinkList*L);

intmenue();

intmain(intargc,char*argv[])

{

LinkList*L;

charsno[5]={'\0'};

charsname[9]={'\0'};

intb=1;

inti=1;

while(b){

switch(menue())

{

case1:

L=createTailList();

//L=createHeadList();

break;

case2:

//displayAll(L);

printf("\t◎输入插入哪个位置前:");

scanf("%d",&i);

insertElem(L,i);

//scanf("%s",sno);

//insertElemBysno(L,sno);

break;

case3:

printf("\t◎输入待删除学生的学号:");

scanf("%s",sno);

deleteElem(L,sno);

break;

case4:

printf("╭═══════════════════════════════╮\n");

printf("║\t学生总数为:%d\t\t║\n",lengthList(L));

printf("╰═══════════════════════════════╯\n\n");

break;

case5:

printf("\t◎输入待查找学生的学号:");

scanf("%s",sno);

locateElemBysno(L,sno);

break;

case6:

printf("\t◎输入待查学生的位置:");

scanf("%d",&i);

getElem(L,i);

break;

case7:

displayAll(L);

break;

case8:

insertSort(L);

break;

case9:

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");

return0;

break;

default:

i=2;

while(i)

{

system("clear");

printf("╭═══════════════════════════════╮\n");

printf("║操作数无效,正在返回主菜单(%d秒)║\n",i--);

printf("╰═══════════════════════════════╯\n");

sleep(1);

}

continue;

}

getchar();

printf("PRESSENTERTOCONTINUE!");

while(1){

if('\n'==getchar())

{

break;

}

}

}

return0;

}

intmenue()

{

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_trawtime;

structtm*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);

charcolorname[3][20]={{"RED"},{"BLUE"},{"YELLLOW"}};

srand(time(&rawtime));//时间触发

//textcolor(colorname[rand()%3]);

//printf("\t[textcoloris%s]\n",colorname[rand()%3]);

//颜色码和控制码我的参考链接http://wenku.baidu.com/view/a38f77ff910ef12d2af9e70b.html

printf("\t◎输入功能项:");

inta=0;

scanf("%d",&a);

printf("\033[0m");

system("clear");

returna;

}

LinkList*inputdata()

{

LinkList*s=NULL;

charsno[5]={'\0'};

charsname[9]={'\0'};

intscore=0;

printf("\tsno\t->");

scanf("%s",sno);

if(sno[0]=='#'){

returns;

}

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");

returns;

}

voiddisplay(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");}

voiddisplayAll(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;

returnL;

}

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;

}

returnL;

}

voidgetElem(LinkList*L,inti)

{

LinkList*p=L;

intj=0;

while(p&&j<i){

p=p->next;

j++;

}

if(!p){

printf("╭═══════════════════════════════╮\n");

printf("║\tDon'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

else

{

display(p);

}

}

voidlocateElemBysno(LinkList*L,charch[5])

{

LinkList*p=L->next;

while(p&&(0!=strcmp(p->data.sno,ch)))

{

p=p->next;

}

if(!p){

printf("╭═══════════════════════════════╮\n");

printf("║\tDon'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

else

{

display(p);

}

}

voidlocateElemBysname(LinkList*L,charch[9])

{

LinkList*p=L->next;

while(p&&(0!=strcmp(p->data.sname,ch)))

{

p=p->next;

}

if(!p){

printf("╭═══════════════════════════════╮\n");

printf("║\tDon'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

else

{

display(p);

}

}

intlengthList(LinkList*L)

{

LinkList*p=L->next;

intj=0;

while(p){

p=p->next;

j++;

}

returnj;

}

voidinsertElem(LinkList*L,inti)

{

LinkList*s=inputdata();

LinkList*p=L;

intj=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'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

displayAll(L);

}

voidinsertElemBysno(LinkList*L,charch[5])

{

LinkList*p=L;

LinkList*s=NULL;

while(p&&(0!=strcmp(p->data.sno,ch)))

{

p=p->next;

}

if(!p){

printf("╭═══════════════════════════════╮\n");

printf("║\tDon'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

else

{

s=inputdata();

s->next=p->next;

p->next=s;

}

}

voiddeleteElem(LinkList*L,charch[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'tfindthestudent!\t║\n");

printf("╰═══════════════════════════════╯\n\n");

}

else

{

display(p);

q->next=p->next;

free(p);

}

}

voidinsertSort(LinkList*L)

{

LinkList*L1;

LinkList*p;

LinkList*q;

LinkList*s;

intlen;

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("║\tThestudentlinklistisempty!\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);

}