经典算法_链表

1 创建一个链表,包含在尾部插入数据和输出的函数。

头文件linknode.h

源文件

源文件main.c

源文件linknode.c

2 创建一个链表,静态模式

3 创建一个链表,动态模式

1 创建一个链表,包含在尾部插入数据和输出的函数。

头文件linknode.h

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 struct student
 5 {
 6     int num;
 7     float score;
 8     struct student *pNext;
 9 };
10
11 typedef struct student ST;
12
13 void add(ST **phead, int inum, float iscore);//函数声明,传入头结点的地址,然后插入
14
15 void showall(ST *head);//传递头结点,显示所有数据

源文件main.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include "linknode.h"
 6
 7 main()
 8 {
 9     struct student *head = NULL;//头结点指针
10
11     add(&head, 1, 70);
12     add(&head, 2, 80);
13     add(&head, 3, 90);
14     add(&head, 4, 91);
15     add(&head, 5, 92);
16
17     showall(head);
18
19     system("pause");
20 }

源文件linknode.c

 1 #include "linknode.h"
 2
 3 void add(ST **phead, int inum, float iscore)//函数声明,传入头结点的地址,然后插入
 4 {
 5     if (*phead == NULL)
 6     {
 7         ST *newnode = (ST *)malloc(sizeof(ST));//分配内存
 8         if (newnode == NULL)
 9         {
10             printf("内存分配失败");
11             return;
12         }
13         newnode->num = inum;//结点初始化
14         newnode->score = iscore;
15         newnode->pNext = NULL;
16
17         *phead = newnode;//让头指针指向这个结点
18     }
19     else
20     {
21         //链表不为空,尾部插入
22         ST *p = *phead;//指向头结点
23         if (newnode == NULL)
24         {
25             printf("内存分配失败");
26             return;
27         }
28         while (p->pNext != NULL)//循环到最后一个结点的地址
29         {
30             p = p->pNext;
31         }
32         ST *newnode = (ST *)malloc(sizeof(ST));//分配内存
33         newnode->num = inum;//结点初始化
34         newnode->score = iscore;
35         newnode->pNext = NULL;
36
37         p->pNext = newnode;//链接上
38     }
39 }
40
41 void showall(ST *head)//传递头结点,显示所有数据
42 {
43     while (head != NULL)//判断指针是否指向为空
44     {
45         printf("num=%d,score=%f,%x,%x\n", head->num, head->score, head, head->pNext);
46         head = head->pNext;//指针不断向前循环
47     }
48 }

2 创建一个链表,静态模式

 1 #define _CRT_SECURE_NO_WARNINGS
 2
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5
 6 struct info
 7 {
 8     int num;
 9     void *p;
10 };
11
12 main()
13 {
14     struct info info1;//创建指针,静态模式
15     info1.num = 123;
16     info1.p = &info1.num;//存储地址
17
18     printf("%d,%x\n", info1.num, info1.p);
19
20     system("pause");
21 }

3 创建一个链表,动态模式

 1 #define _CRT_SECURE_NO_WARNINGS
 2
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5
 6 struct info
 7 {
 8     int num;
 9     void *p;
10 };
11
12 main()
13 {
14     struct info *pinfo;//创建指针,动态模式
15
16     pinfo = (struct info *)malloc(sizeof(struct info));//分配内存
17
18     pinfo->num = 125;
19     pinfo->p = &pinfo->num;
20
21     printf("%d,%x\n", pinfo->num, pinfo->p);
22     printf("%d,%x\n", (*pinfo).num, (*pinfo).p);//等价于上面
23
24     system("pause");
25 }

123

时间: 2024-11-16 01:56:37

经典算法_链表的相关文章

经典算法学习——链表实现冒泡排序

我在之前一篇博客<经典算法学习--冒泡排序>中简单实现了使用数组进行冒泡排序.这篇博客我们将来实现使用链表如何排序,其实整体的思路是一样的.示例代码上传至: https://github.com/chenyufeng1991/BubbleSortLinkedList . 算法描述如下: (1)比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换: (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就到了最后一个位置,也就是下标为N-1的位置(沉到了水底).

经典算法学习——链表中倒数第k个节点

这是剑指Offer中非常经典的一道题,也是在面试笔试中高频出现.题目的详细描述如下:输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第一个节点. 本题有一个非常直观的解法,就是对链表扫描两遍,第一遍用来记录链表长度为n,第二次从链表头部走(n-k+1)步后,找到的那个节点就是倒数第k个节点.这种算法的问题就是需要扫描链表两遍,显得不是特别聪明. 其实多想想,这个算法模型和栈的形式非常像,我们只要从头开始扫描链表,把扫描到的每一个节点放入栈中,扫

指针与数据结构算法_链表(C语言)

一.变量: 声明一个变量系统是没有给这个变量分配内存空间的: 例: int j;//编译的时候是没有分配内存空间的 int i=3;//计算机在编译的时候就会给这个i分配4个字节的内存空间 二.malloc动态分配内存地址: 回想一下:我们在程序中存储一个整数10:除了使用int a;在内存中申请一块区域来存储,还有一种方法: malloc(4);                    //从内存中申请4个字节大小的内存存放整数10 在C中经常看到这样的写法: (int *)malloc(siz

经典算法_指针

一个指向整型数的指针 int*p 一个指向整型数指针的指针 int **p 一个有10个整型指针的数组 int *p[10] 一个指向有10个整型数数组的指针 int (*p)[10] 一个指向函数的指针,该函数有一个整型参数,并返回一个整型数 int ( *p)(int) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数,并返回一个整型数. int(*p[10])(int) 一个指向函数指针的指针,所指向的函数有一个整型参数,并返回一个整型数. int (**p)(int) i

经典算法_位运算

1 按位异或 适用于:面试,嵌入式开发需要节约内存的场合 不借助中间变量,交换2个变量 x=x+y y=x-y x=x-y 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 unsigned char ch1 = 10; 9 unsigned char ch2 = 20; 10 11 printf("%d,%d\n", ch1

经典算法_字符串

1 写出函数,相当于strncat 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<string.h> 6 7 void mystrncat(char *bc, char *c, int length) 8 { 9 if (bc == NULL || c == NULL) 10 { 11 return NULL; 12 } 13 else 14

经典算法_预处理

预处理 1 宏定义 2 文件包含 3 条件编译 1 宏定义 软件工程规定,宏定义用英文大写 define不会进行类型检查,只会替换,所以某些场合会出错. 尽量不用define,用const,const初始化的时候,会自动进行类型转换,会有类型检查 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 #define M 10.0 7 8 main() 9 { 10 con

经典算法_结构体

1 动态结构体 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 struct dangdang 7 { 8 char email[30]; 9 char name[30]; 10 char addr[100]; 11 int num; 12 int bignum; 13 char tel[20]; 14 char phone[20]; 15 double rmb; 16

经典算法题每日演练——第二十一题 十字链表

原文:经典算法题每日演练--第二十一题 十字链表 上一篇我们看了矩阵的顺序存储,这篇我们再看看一种链式存储方法“十字链表”,当然目的都是一样,压缩空间. 一:概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(row,col,val,down,right),其中: row:矩阵中的行. col:矩阵中的列. val:矩阵中的值. right:指向右侧的一个非零元素. down:指向下侧的一个非零元素. 现在我们知道单个节点该如何表示了,那么矩阵中同行的非零元素的表示不就是一个单链