一款非常好用的Thinkphp制作的erp进销存多仓库erp系统源码,THINKPHP框架二次开发wms,各功能齐全,非常适合中小店使用。
文件:590m.com/f/25127180-497690772-937e77(访问密码:551685)
以下内容无关:
-------------------------------------------分割线---------------------------------------------
学习数据结构,进行单链表操作是很基础的内容;只要掌握单链表,那么循环链表、栈和队列的操作将是水到渠成的事情。单链表的难点在于结构体和指针的配合使用,这点掌握熟练,那么单链表也不在话下。这篇文章的示例程序是在Ubuntu16.04操作系统环境中进行的。
我们学习链表的目的是什么?也就是说我们学习链表是要解决什么样的问题呢?大家都知道,针对数组,一组数据的数据类型少,产生了结构体,而结构体和数组都有一个共同的特点,在定义的时候就要规定明确的数据个数。所以对于有限个数据的处理,我们使用结构体或数组就够用了,但是,很多实际问题,我们无法在定义的时候能够明确具体的数据个数,很多时候会有未知个数的数据需要处理,这时我们就需要使用链表来进行操作了。
下面我们便以代码为例,简单说明一下单链表的操作。
首先编写头文件,头文件的名称为:linklist.h。声明结构体,声明各个操作函数。一般的单链表操作,是不会在节点中加入编号的,而我个人认为,加入编号方便后续的编程实现,也不容易产生混乱,可以进一步验证正确与否,尽管这样做,对于代码编写难度略有提高。
复制代码
1 /*
2 * 文件名为:linklist.h
3 * 文件作用:声明结构体,声明各个操作函数,便于主函数的调用
4 * 文件用途:用于单链表的操作使用
5 /
6 typedef int datatype; /自定义变量datatype 便于阅读。/
7 / 定义结构体部分*/
8 typedef struct node{
9 datatype data;
10 int no;
11 struct node * next;
12 }listnode,linklist;
13
14 / 声明各个操作函数*/
15 /* 声明创建空表函数,返回值为空表指针*/
16 linklist list_create(void);
17 /* 声明头结点插入节点函数,返回值为操作是否成功,成功:0失败:-1*/
18 int list_head_insert(linklist H,datatype x);
19 /* 声明按节点编号插入节点函数,返回值为操作是否成功,成功:0失败:-1*/
20 int list_pos_insert(linklist H,datatype x,int pos);
21 /* 声明按数值查找函数,返回值为节点编号,失败:-1*/
22 int list_number_search(linklist H,datatype x);
23 /* 声明按节点序号查找函数,返回值为该节点编号下的数值,失败:-1*/
24 int list_pos_search(linklist H,int pos);
25 /* 声明删除指定节点编号的节点函数,返回值为操作是否成功,成功:0失败:-1*/
26 int list_delete(linklist H,int pos);
27 /* 声明将链表数据全部倒置,返回值为操作是否成功,成功:0失败:-1*/
28 int list_invode(linklist H);
29 /* 声明链表输出显示各个节点数据的函数,返回值为操作是否成功,成功:0失败:-1*/
30 int list_show(linklist H);
复制代码
以上便是头文件的编写,下面创建linklist.c文件,用于各个函数功能的实现。由于文件中代码行数较多,不方便讲述,所以下面的讲述,不是将代码整段贴在下面,而是以函数为单位进行了分割,组合起来和源文件也是一模一样的。
第一个函数功能是创建空表,函数没有参数,但是返回值是指向创建空表的指针。首先要创建动态内存,赋值给空表指针,判断指针是否为空来确定动态内存是否分配成功,若成功,则继续给空表内的各个数值及指针赋值。最后返回指针,完成空表的创建。
复制代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include “linklist.h”
4 linklist list_create(void)
5 {
6 linklist H = NULL;
7 /* 申请动态内存,赋值给指针*/
8 H = (linklist)malloc(sizeof(listnode));
9 /* 判断动态内存是否申请成功*/
10 if(H == NULL)
11 {
12 printf(“no memory\n”);
13 return NULL;
14 }else
15 {
16 /* 给空表中结构体中的各个成员赋值*/
17 H -> data = 0;
18 H -> no = -1;
19 H -> next = NULL;
20 /* 返回空表指针*/
21 return H;
22 }
23 }
复制代码
第二个函数功能是,在头结点之后插入结点元素。函数有两个参数,第一个参数是:所要插入节点的链表指针,第二个参数是:插入节点中结构体成员中数据的数值。返回值为操作是否成功,若成功则返回0,若失败则返回-1。
首先要判断传参传入的链表指针是否为空,若为空说明是一个失败的链表,不能继续执行插入操作,因此返回-1,就此程序结束;若不为空则继续执行插入操作。在执行插入之前先要创建一个节点,节点的创建也需要申请动态内存管理空间,将动态内存申请的节点指针,赋予头结点的节点指针,头结点的节点指针赋予动态内存申请的指针,将参数传入的数据赋值给新创建的节点结构体中的成员,成员编号赋予0,表示头结点的下一个编号。由于每次调用这个函数,我们不能确定是第几次给头结点插入节点,因此节点的编号必然需要刷新,这样构建循环,在循环中让插入的节点的下一个节点依次自增1,使编号不会混乱。最后返回0值表明程序顺利执行。