链表_初步认识

根据代码来分析链表的操作

eg:

1.定义一个结构体,并定义一个表头指针

1 typedef struct NAME{
2     char *name;
3     struct NAME *pre;
4     struct NAME *next;
5 }T_Name, *PT_Name;
6
7 static PT_Name g_ptNameHead;

2.编写main函数

 1 int main(int argc, char **argv)
 2 {
 3     char c;
 4
 5     while (1)
 6     {
 7         printf("<l> List all the names\n");
 8         printf("<a> add one name\n");
 9         printf("<d> del one name\n");
10         printf("<x> exit\n");
11
12
13         printf("Enter the choise: ");
14
15         c = getchar();
16         switch (c)
17         {
18             case ‘l‘:
19             {
20                 list_all_name();
21                 break;
22             }
23             case ‘a‘:
24             {
25                 add_one_name();
26                 break;
27             }
28             case ‘d‘:
29             {
30                 del_one_name();
31                 break;
32             }
33             case ‘x‘:
34             {
35                 return 0;
36                 break;
37             }
38             default:
39             {
40                 break;
41             }
42         }
43     }
44
45     return 0;

main函数主要接收外面传进来的参数,作出一系列操作。

l:显示所有的名字

a:添加一个名字

d:删除一个名字

x:退出操作

3.完善各个函数的编写

3.1 add_one_name和add_name函数

 1 void add_one_name()
 2 {
 3     PT_Name ptNew;
 4     char *str;
 5     char name[128];
 6
 7     printf("enter the name:");
 8     scanf("%s", name);
 9
10     str  = malloc(strlen(name) + 1);
11     strcpy(str, name);
12
13     ptNew = malloc(sizeof(T_Name));
14     ptNew->name = str;
15     ptNew->pre  = NULL;
16     ptNew->next = NULL;
17
18     add_name(ptNew);
19 }

add_name函数主要把内容填充进来,构造ptNew结构体

 1 void add_name(PT_Name ptNew)
 2 {
 3     PT_Name ptCur;
 4
 5     if (g_ptNameHead == NULL)
 6     {
 7         g_ptNameHead = ptNew;
 8     }
 9     else
10     {
11         ptCur = g_ptNameHead;
12         while (ptCur->next)
13         {
14             ptCur = ptCur->next;
15         }
16         ptCur->next = ptNew;
17         ptNew->pre  = ptCur;
18     }
19 }

add_name函数主要在链表的末尾添加新的链表,并记录其前一个链表的地址,实现双向链表的作用。

3.2 del_one_name、get_name和del_name函数

 1 void del_one_name()
 2 {
 3     PT_Name ptFind;
 4     char name[128];
 5
 6     printf("enter the name:");
 7     scanf("%s", name);
 8
 9     ptFind = get_name(name);
10     if (ptFind == NULL)
11     {
12         printf("do not have this name\n");
13         return ;
14     }
15
16     del_name(ptFind);
17
18 }
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 NULL;
}
 1 void del_name(PT_Name ptDel)
 2 {
 3     PT_Name ptCur;
 4     PT_Name ptPre;
 5     PT_Name ptNext;
 6
 7     if (g_ptNameHead == ptDel)
 8     {
 9         g_ptNameHead = ptDel->next;
10         /* 释放 */
11         return;
12     }
13     else
14     {
15         ptCur = g_ptNameHead->next;
16         while (ptCur)
17         {
18             if (ptCur == ptDel)
19             {
20                 /* 从链表中删除 */
21                 ptPre  = ptCur->pre;
22                 ptNext = ptCur->next;
23                 ptPre->next = ptNext;
24                 if (ptNext)
25                 {
26                     ptNext->pre = ptPre;
27                 }
28                 break;
29             }
30             else
31             {
32                 ptCur = ptCur->next;
33             }
34         }
35     }
36
37     free(ptDel->name);
38     free(ptDel);
39 }

get_name函数主要是从输入端获取要删除的name,并找到其对应的结构体返回。del_name函数主要是根据传入的ptDel参数,把该结构体从链表中除去。

3.3list_all_name

list_all_name函数主要是实现链表的显示
 1 void list_all_name(void)
 2 {
 3     PT_Name ptCur;
 4     int i = 0;
 5     ptCur = g_ptNameHead;
 6     while (ptCur)
 7     {
 8         printf("%02d : %s\n", i++, ptCur->name);
 9         ptCur = ptCur->next;
10     }
11 }
时间: 2024-12-21 14:54:18

链表_初步认识的相关文章

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,C语言函数传地址如何传,是否不需要我这样多次申请内存空间?欢迎交流. 代码如下: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct PolyNode *Poly;//定义多项式结构体类型 5 struct PolyNode{ 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

数据结构 链表_双向链表的接口定义

双向链表介绍 双向链表中的每一个元素都由3部分组成:除了数据成员.next指针外,每个元素还包含一个指向其前驱元素的指针,称为prev指针.双向链表的组成是这样的:将一些元素链接在一起,使得每个元素的next指针都指向其后继的元素,而每个元素的prev指针都指向其前驱元素. 为了标识链表的头和尾,将第一个元素的prev指针和最后一个元素的next指针设置为NULL. 要反向遍历整个双向链表,使用prev指针以从尾到头的顺序连续访问各个元素.当我们知道某个元素存储在链表在的某处时,我们可以选择按何

数据结构 链表_双向链表的实现与分析

双向链表的实现与分析 双向链表的组成 :1.数据成员:2.指向下一个元素的next指针:3.指向前一个元素的prev指针. 数据结构DListElmt:代表双向链表中的单个元素(节点). 数据结构DList:代表双向链表数据结构,该结构的成员同前面介绍的单链表相似. 示例1:双向链表抽象数据类型的头文件 /*dlist.h*/ #ifndef DLIST_H #define DLIST_H /*定义双向链表中的元素*/ typedef struct DListLemt_ { void *data

链表_有序链表(插入删除遍历)

插入的节点位置有两种情况,一是有previous节点,而是没有previous节点 //链结点 public class Link { public long dData; public Link next; public Link(long dd) { dData=dd; } public void displayLink() { System.out.print(dData+" "); } } public class SortedList { private Link first

读《Spring源码深度解析》-------第一节_初步了解Spring

1.  Spring是什么? Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止运用于企业运用. 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 2.  为什么是Spring? 在Spring上开发简单 在Spring上开发方便 在Spring上开发快捷 3.  Spring的整体架构图. Spring是一个分层框架包括下面一系列要素. 原文地址:https://www.cnblogs.com/boychen/p/9124074.html

Python面向对象(1)_初步认识

面向对象 面向对象与面向过程编程相比的两个特点 1,减少代码的重用性. 2,增强代码的可读性. 面向对象编程的优点 1.是一类相似功能函数的集合,使你的代码更清晰化,更合理化. 2.面向对象,要拥有上帝的视角看问题,对象就从具体的模板实例化出来. 类的结构 class 是关键字与def用法相同,定义一个类. Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头. 类的结构从大方向来说就分为两部分: 静态变量. 动态方法 类名操作静态属性 第一种

第十九周 银行系统(链表、二进制、业务明细)

基本要求:定义了用户类(User)和银行类(Bank),用成员函数实现各种功能,多文件组织程序,能用文本文件存取数据(如示例中给出的技术): 拓展方向: 序号 加分项目 细       则 1 改变Bank类中用户信息的存储方式 用对象的指针数组存储(User *user[upNum]) 或者用动态数组(User *users,空间用new分配) 2 功能扩充 按银行实际业务的要求,增加User类中的数据成员,能够记录身份证号.家庭住址等信息,并在相关业务中使用这些数据. 记录用户的每一笔业务,

数据结构链表学习

今天初步学习数据结构链表,学习过程中感觉对于指针的理解还差很多,而且对于VS的调试也不会使用,调查问题只能靠一遍一遍的梳理逻辑,效率不是一般的低下..接下来得赶紧学习下VS的使用.. 今天链表只是初步学习,写的例子也比较简单,如下: 定义链表的数据结构,只简单的定义了一个数据和一个指向后继的指针 1 struct List { 2 int num; 3 List *next; 4 }; 接下来就是链表的创建,返回一个指针地址赋给主函数中的头指针,用于之后的增删改查等等 1 List *creat