array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 单向链表操作:新建,输出,删除,插入 - 爱码网

1.新建

算法:使p1指向新开辟的结点,p2指向链表中最后一个结点,把p1所指的结点连接在单向链表操作:新建,输出,删除,插入p2所指结点的后面,用“p2->next=p1”来实现。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<malloc.h>
 4 
 5 #define LEN sizeof(struct student)
 6 
 7 struct student{
 8     long num;
 9     float score;
10     struct student *next;
11 };
12 
13 struct student *creat(void){
14     struct student *head=NULL,*p1,*p2;
15     int n=0;
16 
17     p1=(struct student *)malloc(LEN);
18     p2=p1;
19 
20     printf("Input one student's data:\n");
21     scanf("%ld,%f",&p1->num,&p1->score);
22     while(p1->num!=0)
23     {
24         n++;
25         if(n==1)
26             head=p1;
27         else
28             p2->next=p1;
29         p2=p1;
30         p1=(struct student *)malloc(LEN);
31         printf("Input one student's data:\n");
32         scanf("%ld,%f",&p1->num,&p1->score);
33     }
34     p2->next=NULL;
35     return head;
36 }
新建链表

2.输出

1 void print(struct student *head)
2 {
3     struct student *p;
4     for(p=head;p!=NULL;p=p->next)
5     {
6         printf("%ld,%f\n",p->num,p->score);
7     }
8 }
输出链表

3.删除

 这是我用for循环编写的:

 1 struct student *del(struct student *head,long num){
 2     struct student *p1,*p2;
 3     if(head==NULL)
 4         printf("The list is NULL.\n");
 5     else
 6         for(p1=head;p1!=NULL;p1=p1->next)
 7         {
 8             if(p1->num==num)
 9             {
10                 if(p1==head)
11                     head=p1->next;
12                 else
13                     p2->next=p1->next;
14                 break;
15             }
16             else
17             {
18                 p2=p1;
19             }
20         }
21 
22     if(p1==NULL)
23         printf("cannot find the %ld.\n",num);
24     return head;
25 }
删除结点1

书上用while循环编写的:

 1 struct student *del(struct student *head,long num){
 2     struct student *p1,*p2;
 3     if(head==NULL)
 4     {
 5         printf("The list is NULL.\n");
 6         return head;
 7     }
 8     p1=head;
 9     while(p1->num!=num&&p1->next!=NULL)//当前结点不是要删除的结点而且后面还有结点。
10     {
11         p2=p1;
12         p1=p1->next;
13     }
14     if(p1->num==num)
15     {
16         if(p1==head)
17             head=p1->next;
18         else
19             p2->next=p1->next;
20     }
21     else
22         printf("%ld cannot be found.\n",num);
23     return head;
24 }
删除结点2

 4.插入

使用for循环编写:

 1 struct student *insert(struct student *head,struct student *stu){
 2     struct student *p0,*p1,*p2;
 3     p0=stu;
 4     for(p1=head;p1!=NULL;p1=p1->next)
 5     {
 6         if(p1->num < p0->num)
 7             p2=p1;
 8         else
 9         {
10             if(p1==head)
11                 head=p0;
12             else
13                 p2->next=p0;
14             p0->next=p1;
15             break;
16         }
17     }
18     if(p1==NULL)
19     {
20         if(p1==head)
21             head=p0;
22         else
23             p2->next=p0;
24         p0->next=NULL;
25     }
26     return head;
27 }
插入结点1

使用while循环编写:

 1 struct student *insert(struct student *head,struct student *stu){
 2     struct student *p0,*p1,*p2;
 3     p0=stu;
 4     if(head==NULL)
 5     {
 6         head=p0;
 7         p0->next=NULL;
 8     }
 9     else
10     {
11         p1=head;
12         while(p1->num<p0->num&&p1->next!=NULL)
13         {
14             p2=p1;
15             p1=p1->next;
16         }
17         if(p1->num>p0->num)
18         {
19             if(p1==head)
20                 head=p0;
21             else
22                 p2->next=p0;
23             p0->next=p1;
24         }
25         else
26         {
27             p1->next=p0;
28             p0->next=NULL;
29         }
30     }
31     return head;
32 }
插入结点2

我刚开始用的函数原型是:

struct student *insert(struct student *head)

插入的结点在函数内部产生,事实证明这样做是不行的。因为插入的结点数据在函数调用完之后就释放了,没有保存。

后来函数原型改为:

struct student *insert(struct student *head,struct student stu)

插入的结点在主函数内产生,经过一番试验后,发现也不对。新结点的数据传递给形参stu,形参stu有自己的地址,insert函数把形参stu连接在了链表中,函数调用完之后,形参stu的值就释放了,链表中新结点处的值为不确定的值。

 

链表学习心得:在对链表进行操作的过程中,要设两个循环变量指针:p1和p2。其中p1指向当前要进行操作或处理的结点,p2指向当前结点的前一个结点,当前结点的后一个结点可以直接用p1->next表示。循环遍历数组的话,可以用p++和p--指向后一个元素和前一个元素,但是因为链表中的结点不是连续存放的,所以只能用设两个循环变量的方法遍历数组。

相关文章: