链表的实战讲解(综合以前的基础)

这是前面我讲得算法与数据结构中链表的综合,如果这里不明白请看前面的基础知识:链接地址

#include <stdio.h>

#include <stdlib.h>
#include <string.h>

/* 定义一个结构体 */

typedef struct NAME{
char *name;
struct NAME *pre;
struct NAME *next;
}T_Name, *PT_Name;

static PT_Name   g_ptNameHead;    /* 定义链表头 */

void add_name(PT_Name ptNew)
{
PT_Name ptCur;

if (g_ptNameHead == NULL)
{
g_ptNameHead = ptNew;
}
else
{
ptCur = g_ptNameHead;
while (ptCur->next)
{
ptCur = ptCur->next;
}
ptCur->next = ptNew;
ptNew->pre  = ptCur;
}
}

void del_name(PT_Name ptDel)
{
PT_Name ptCur;
PT_Name ptPre;
PT_Name ptNext;

if (g_ptNameHead == ptDel)   /* 如果链表头等于当前删除的链表 */
{
g_ptNameHead = ptDel->next;
/* 释放 */
return;
}
else
{
ptCur = g_ptNameHead->next;
while (ptCur)
{
if (ptCur == ptDel)
{
/* 从链表中删除 */
ptPre  = ptCur->pre;
ptNext = ptCur->next;
ptPre->next = ptNext;
if (ptNext)
{
ptNext->pre = ptPre;
}
break;
}
else
{
ptCur = ptCur->next;
}
}
}

free(ptDel->name);
free(ptDel);
}

void add_one_name()

{
PT_Name ptNew;
char *str;
char name[128];

printf("enter the name:");
scanf("%s", name);

str  = malloc(strlen(name) + 1);  

/* name是一个局部变量,用来存放名字,当这个函数结束的时候,该内存就得释放,所以我们得单独分配一块内来存放这个name ,下面还得用malloc来分配一个结构体大的内存空间,记住我们定义结构体的时候不能添加static,因为定义结构提示不会分配内存空间的,他定义的只是这种类型,所以我们增加的时候一定要记得分配内存*/

strcpy(str, name);
ptNew = malloc(sizeof(T_Name));
ptNew->name = str;
ptNew->pre  = NULL;
ptNew->next = NULL;

add_name(ptNew);
}

PT_Name get_name(char *name)
{
PT_Name ptCur;
if (g_ptNameHead == NULL)
{
return NULL;
}
else
{
ptCur = g_ptNameHead;
do {
if (strcmp(ptCur->name, name) == 0)
return ptCur;
else
ptCur = ptCur->next;
}while (ptCur);
}

return NUL;

}

void del_one_name()
{
PT_Name ptFind;
char name[128];

printf("enter the name:");
scanf("%s", name);

ptFind = get_name(name);

if (ptFind == NULL)
{
printf("do not have this name\n");
return ;
}

del_name(ptFind);
}

void list_all_name(void)
{
PT_Name ptCur;
int i = 0;
ptCur = g_ptNameHead;
while (ptCur)
{
printf("%02d : %s\n", i++, ptCur->name);
ptCur = ptCur->next;
}
}

int main(int argc, char **argv)
{
char c;
while (1)
{
printf("<l> List all the names\n");
printf("<a> add one name\n");
printf("<d> del one name\n");
printf("<x> exit\n");
printf("Enter the choise: ");

c = getchar();

switch (c)
{
case 'l':
{
list_all_name();
break;
}
case 'a':

{

add_one_name();

break;
}
case 'd':
{
del_one_name();
break;
}
case 'x':
{
return 0;
break;
}
default:
{
break;
}
}
}

return 0;
}

时间: 2024-09-17 04:53:55

链表的实战讲解(综合以前的基础)的相关文章

实战讲解:正规SEO如何让新站上百度首页

过去几天,恰巧碰到百度关于超链作弊的算法升级,影响力一步一步扩散开来,估计百度的数据库太大,在笔者写这边文章的时候,估计算法升级的影响还在进一步扩散,因此笔者在各大站长论坛看到,关于此次算法更新的抱怨文章,成为当下的热门话题,为什么每次百度算法更新,都有那么多人在那担心呢?其中原因笔者不必多说,想必大家自己心里知道.今天,笔者给大家带来一个通过正规SEO如何让新站上百度首页,并且在最近三个月内的百度任何算法更新中,都稳步提升排名,希望在这动乱的关键时刻,能给大家提供一些经验 网站的综合概述 笔者

实战讲解竞价创意的编写技巧

创意撰写通用技巧 一条吸引人的创意,意味着更多人点击. 一条针对性的创意,意味着点击更精确. So...... 一条好的创意,会提高你在市场的竞争力! 创意的撰写技巧无非以下几种: 一.通配: 1.标题和描叙保证3-5处通配; 2.标题和表达的通配符位置靠前; 3.多使用关键词词根(非通配符);     二.通顺: 账号结构划分必须合理;   三.相关: 1.围绕产品或服务特点来撰写创意; 2.针对单元内网民搜索意图撰写创意; 开发实战讲解">    四.吸引: 1.使用短语.疑问.感叹等

综合布线技术基础

一.概述 综合布线是一种模块化的.灵活性极高的建筑物内或建筑群之间的信息传输通道.它既能使语音.数据.图像设备和交换设备与其它信息管理系统彼此相连,也能使这些设备与外部相连接.它还包括建筑物外部网络或电信线路的连接点与应用系统设备之间的所有线缆及相关的连接部件.综合布线由不同系列和规格的部件组成,其中包括:传输介质.相关连接硬件(如配线架.连接器.插座.插头.适配器)以及电气保护设备等.这些部件可用来构建各种子系统,它们都有各自的具体用途,不仅易于实施,而且能随需求的变化而平稳升级. 1.综合布

CSS中选择器优先级顺序实战讲解

原文:CSS中选择器优先级顺序实战讲解 我们有些程序猿在给一个元素(比如div)应用样式的时候,会有一些疑问,为什么我写在后面的样式不能覆盖前面的样式呢,不是说CSS是层叠样式表吗? 如果你在开发中也遇到同样的问题,即在给某一元素应用样式的时候(比如写在外部样式表中),写在后面的样式不能覆盖前面定义的样式.这个时候,你可能就得考虑是不是没考虑优先级问题了.   当我们在给一个标签,比如div应用样式的时候,我们得考虑优先级问题. 下面列出的就是是选择器的优先级:     行内样式 > ID选择器

实战讲解防范网络钓鱼技术大全

网络钓鱼(Phishing)一词,是"Fishing"和"Phone"的综合体,由于黑客始祖起初是以电话作案,所以用"Ph"来取代"F",创造了"Phishing",Phishing 发音与 Fishing相同."网络钓鱼"就其本身来说,称不上是一种独立的攻击手段,更多的只是诈骗方法,就像现实社会中的一些诈骗一样. 攻击者利用欺骗性的电子邮件和伪造的Web站点来进行诈骗活动,诱骗访问者提

《精通CFD动网格工程仿真与案例实战》——1.3 FLUENT基础

1.3 FLUENT基础 精通CFD动网格工程仿真与案例实战1.3.1 FLUENT网格术语的定义 如图1.7所示,在FLUENT中二维网格和三维网格的每个部分的术语定义.单元cell指的是由计算域离散而成的控制体,计算域是由表示流体或固体的网格单元而定义的.面face指的是单元的边界.边Edge指的是面的边界.节点Node指的是边相交的网格节点.在二维网格情况下edge已经退化为节点Node.一组cell或face或node定义为一个区域zone.边界数据定义为面区域(face zone),材

《我的视频我做主:Premiere Pro CS5实战精粹》——第一部分 基础篇 第1章 非线性剪辑基础 1.1 认识非线性剪辑

第一部分 基础篇 主要讲解了Premiere Pro CS5视频剪辑过程中所使用的基本方法和主要操作流程,使即便没有软件操作基础的读者也能够对软件有全面.概括性地了解. 第1章 非线性剪辑基础 第2章 海景风光片的制作 第3章 为海景风光片添加声音 第4章 海景风光片的视频输出 第1章 非线性剪辑基础 本章是非线性剪辑的基础章节,详细介绍了非线性剪辑技术以及视频编辑基础知识,如高清.标清.帧率.像素宽高比等概念.同时本章还是Premiere的入门章节,对Adobe Premiere Pro CS

《TensorFlow技术解析与实战》——第一篇 基础篇

第一篇 基础篇 TensorFlow技术解析与实战著名历史学家斯塔夫里阿诺斯在<全球通史>中,曾以15世纪的航海在"物理上"连通"各大洲"作为标志将人类历史划分为两个阶段.在我正在写作的<互联网通史>中,我把互联网这个"信息上"连通"人类个体"的物件作为划分人类历史的标志.而随着人工智能最近的崛起,我们又该思考重新划分了,因为人工智能将会在"信息上"连通"各个物体"

iOS自定义转场动画实战讲解

转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerAnimated:completion:这一组函数以模态视图的方式展现.隐藏视图.如果用到了navigationController,还可以调用pushViewController:animated:和popViewController这一组函数将新的视图控制器压栈.弹栈. 下图中所有转场动画都是自定义的动画,这些效果如果不用自定义动