哈佛cs50公开课,list1链表相关程序

很纳闷,上次发的fifteen竟然说包含不适内容,就是程序而已啊,莫名其妙。

这个就是公开课上链表的程序,稍微改了下,没用他的头文件,同时添加了注释。用codeblocks编译通过。

链表这个确实挺麻烦,并不是不能理解,而是具体实施该怎么做。

主要要理解头指针,头节点,第一个节点的含义和怎么表示。

下面是程序:

/*

一个数字链表。可以实现插入(按大小),查询,删除等功能

输入1,用于删除;

输入2,用于寻找;

输入3,用于插入;

输入4,用于遍历;

输入0,用于退出;

*/

#include 

#include 

#include 

//定义链表

typedef struct node

{

int n;//注意这个n,和平时int n区别开来

struct node *next;

}

node;

//头指针

node *first=NULL;

//声明函数

void delete(void);

void find(void);

void insert(void);

void traverse(void);

int getint(void);//代替头文件里的GetInt

//主函数

int

main()

{

int c;

do

{

printf("\n菜单\n\n"

"输入1,删除链表内数字\n"

"输入2,寻找链表内数字\n"

"输入3,插入数字到链表中(自动排序)\n"

"输入4,遍历链表\n"

"输入0,退出\n");

//输入

printf("请输入命令:");

c=getint();

//分类

switch(c)

{

case 1:delete();break;

case 2:find();break;

case 3:insert();break;

case 4:traverse();break;

default:printf("请按照提示输入命令\n");

}

}

while(c!=0);

//释放链表空间

node *ptr=first;

while(ptr!=NULL)

{

node *predptr=ptr;

ptr=ptr->next;

free(predptr);

}

return 0;

}

//getint

int getint(void)

{

int p,m,num;

while(1)

{

p=scanf("%d",&num);//scanf的返回值

while((m=getchar())!='\n'&&m!=EOF);//清除输入缓存

if(p==1)//返回值是数字则为1,否则是其它的

return num;

else

printf("请确保输入的是整数,再试一次:");

}

}

//delete

void

delete(void)

{

printf("输入要删除的数字:");

int n=getint();

node *ptr=first;//为什么不直接用first

node *predptr=NULL;//

while(ptr!=NULL)//最后节点

{

if(ptr->n==n)//链表里面有这个数,这2个n是不一样的,一个是定义链表里的数据,一个是输入的数字

{

//if(ptr->n==first->n)

if(ptr==first)//ptr是在变化的,因为是个while循环,判断ptr变化了没?用这个if(ptr->n==first->n)可以不?实验后可以

{

first=ptr->next;

free(ptr);

}

else//在中间或是尾部

{

predptr->next=ptr->next;//predptr在这里已经不是NULL了,第一个节点不相等就会执行下面的predptr=ptr;而相等就不会进行这一步

free(ptr);

}

break;

}

else

{

predptr=ptr;

ptr=ptr->next;//同上面联系起来看,predptr与ptr相隔1个节点

}

}

if(ptr==NULL)

printf("你所要删除的数字不存在\n");

traverse();

}

//insert

void

insert(void)

{

node *newptr=malloc(sizeof(node));

if(newptr==NULL)

{

printf("申请空间出错\n");

return;

}

printf("输入插入的数字:");

//插入的链表节点

newptr->n=getint();

newptr->next=NULL;

//如果链表是空的,则直接是newptr

if(first==NULL)

first=newptr;//为什么不是first->next=newptr?因为first单纯是个指针,就是第一个节点,first->next是第二个节点了。

//插入链表头部

else if(newptr->nn)//first->n?第一个数据?

{

newptr->next=first;//为什么不是first->next?同上,相当于将newptr和first链接起来

first=newptr;

}

//插入中间或底部

else

{

node *predptr=first;//为什么不直接用first而是新建一个指针predptr呢?

while(1)

{

//是否重复

if(predptr->n==newptr->n)

{

free(newptr);

break;

}

//判断是否在尾部

else if(predptr->next==NULL)

{

predptr->next=newptr;

break;

}

//在中间的情况

else if(predptr->next->n>newptr->n)//predptr->next->n?

{

newptr->next=predptr->next;

predptr->next=newptr;

break;

}

//循环

predptr=predptr->next;

}

}

//遍历一下

traverse();

}

//find

void

find(void)

{

printf("输入要查找的数字:");

int n=getint();

node *ptr=first;

while(ptr!=NULL)

{

if(ptr->n==n)

{

printf("\n已找到%d\n",n);

usleep(100000);

break;

}

ptr=ptr->next;

}

if(ptr==NULL)

printf("你所要寻找的数字不存在\n");

}

//traverse

void

traverse(void)

{

printf("现在列表中存在的数据有:");

node *ptr=first;

while(ptr!=NULL)

{

printf("%d ",ptr->n);

ptr=ptr->next;

}

fflush(stdout);

usleep(100000);

printf("\n\n");

}

免费C/C++基础丶进阶资料,还有实践课程免费领,加群728483370~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容