如何理解数学的抽象性东西很抽象

在一个月内学完抽象代数是怎样一种体验? - 知乎173被浏览27459分享邀请回答7711 条评论分享收藏感谢收起127 条评论分享收藏感谢收起查看更多回答3 个回答被折叠()真心觉得C语言链表很抽象 难学 该如何学习? - 知乎360被浏览58276分享邀请回答cslibrary.stanford.edu/105/LinkedListProblems.pdf不要害怕英文多练,别光看。19125 条评论分享收藏感谢收起#include &stdio.h&
struct node
node *next;
void main()
p.data = 1;
2. 尝试用指针的方式来实现,但下面代码会报错#include &stdio.h&
struct node
node *next;
void main()
(*p).data = 1;
3. 改进下,使用指针前需要先分配存储空间#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
p=(node *)malloc(sizeof(node));
(*p).data = 1;
4. 实现两个节点的串联,并可以单步跟踪,观察节点在内存中的链接关系。#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *p1,*p2;
p1=(node *)malloc(sizeof(node));
(*p1).data = 1;
p2=(node *)malloc(sizeof(node));
(*p2).data = 2;
p1-&next = p2;
5. 增加链表最后一个节点的结束标志#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *p1,*p2;
p1=(node *)malloc(sizeof(node));
(*p1).data = 1;
p2=(node *)malloc(sizeof(node));
(*p2).data = 2;
p1-&next = p2;
p2-&next = NULL;
6.增加一个变量,记录头指针,实现类似这样的效果:#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *head;
node *p1,*p2;
p1=(node *)malloc(sizeof(node));
(*p1).data = 1;
p2=(node *)malloc(sizeof(node));
(*p2).data = 2;
p1-&next = p2;
p2-&next = NULL;
head = p1;
7. 尝试利用循环语句,实现多个节点的初始化。可以体会如何利用有限的变量实现更多节点的初始化操作。#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *head,*p1,*p2;;
for (i=1;i&=5;i++)
p1=(node *)malloc(sizeof(node));
(*p1).data = i;
if(head == 0)
head = p1;
p2-&next = p1;
p2-&next = 0;
原理图为:8. 将上面初始化的链表依次输出#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *head,*p1,*p2;;
// 初始化链表
for (i=1;i&=5;i++)
p1=(node *)malloc(sizeof(node));
(*p1).data = i;
if(head == 0)
head = p1;
p2-&next = p1;
p2-&next = 0;
// 输出链表数据
printf("链表上各结点的数据为:\n");
while(p!=0)
printf("%d ",p-&data);
p=p-&next;
printf("\n");
9.尝试删除链表中的一个节点。实现过程中发现,需要先找到对应的节点。另外,具体实现时发现,需要记录当前节点的前一个节点。#include &stdio.h&
#include &stdlib.h&
struct node
node *next;
void main()
node *head,*p1,*p2,*p;
// 初始化链表
for (i=1;i&=5;i++)
p1=(node *)malloc(sizeof(node));
(*p1).data = i;
if(head == 0)
head = p1;
p2-&next = p1;
p2-&next = 0;
// 删除数据为2的链表节点
p1 = head;
while (p1-&data!=2)
p1 = p1-&next;
p2-&next = p1-&next;
delete p1;
// 输出链表数据
printf("链表上各结点的数据为:\n");
while(p!=0)
printf("%d ",p-&data);
p=p-&next;
printf("\n");
实现这一步骤,已经可以体会到链表相对于数组的优点了。这个例子中仅考虑被删除的节点在链表中间,还有被删除的节点是第一个节点、最后一个节点,没有这个节点的特殊情况,需要考虑。10. 还有插入节点、新增节点、链表排序等功能,利用上面的思路,大家可以自行逐步实现。最后,贴一下相对完整的链表代码。//
// 实现链表的基本操作
#include &stdio.h&
#include &malloc.h&
struct node // 链表上结点的数据结构
node *next;
node *Create(void)
// 产生一条无序链表
node *p1,*p2,*head;
// p2指向最后一个结点, p1指向插入结点,head指向头结点
printf("产生一条无序链表,请输入数据,以-1结束:\n");
scanf("%d",&a);
while(a!=-1)
// 1,3,2,4,-1
p1 = (node *)malloc(sizeof(node));
p1-&data=a;
if(head == 0)
// 插入链表的首部
head = p1; p2 = p1;
// 插入链表尾
p2-&next = p1; p2 = p1;
scanf("%d",&a);
p2-&next = 0;
return (head);
void Print(node *head)
// 输出链表上各结点的数据
printf("链表上各结点的数据为:\n");
while(p!=0)
printf("%d
",p-&data);
p=p-&next;
printf("\n");
node *Delete_one_node(node *head,int num)
// 根据数据值删除链表中的一个结点
node *p1,*p2;
if(head == 0)
printf("链表为空,无结点可删除!\n");
if(head-&data == num)
//删除首结点
p1 = head;
head = head-&next;
free( (void *)p1 );
printf("删除了一个结点!\n");
p1 = head;
p2 = head-&next;
// p1指向比较节点的前一个结点
while(p2-&data != num && p2-&next != 0)
// 找到要删除的结点
p2 = p2-&next;
if(p2-&data == num)
// 删除找到的结点
p1-&next = p2-&next;
free( (void *)p2 );
printf("删除了一个结点!\n");
printf("链表上没有找到要删除的结点!\n");
return head;
node *Insert(node *head,node *p)
// 将一个结点插入链表中
node *p1,*p2;
if(head == 0 )
// 空链表,插入链表首结点
p-&next = 0;
return head;
if(head-&data &= p-&data)
// 非空链表,插入到链表的首结点
p-&next = head;
return head;
p2 = p1 = head;
while(p2-&next && p2-&data &p-&data)
// 找到要插入的位置
p2 = p2-&next;
if(p2-&data & p-&data)
// 插入链表尾
p2-&next = p;
p-&next = 0;
// 插入在p1和p2所指向的结点之间
p-&next = p2;
p1-&next = p;
return head;
node *Create_sort(void)
// 产生一条有序链表
node *p1,*head = NULL;
printf("产生一条有序链表,请输入数据,以-1结束:\n");
scanf("%d",&a);
while(a!=-1)
p1 = (node *)malloc(sizeof(node));
// 产生一个新结点
p1-&data=a;
head = Insert(head,p1);
// 将新结点插入链表中
scanf("%d",&a);
return head;
void deletechain(node *head)
// 释放链表上各结点占用的内存空间
while(head)
p1 = head;
head = head-&next;
free( (void *)p1 );
/////////////////////////////////////////////////////////////////////////////
void main()
node * head;
head = Create();
// 产生一条无序链表
1,3,2,5,-1
Print(head);
// 输出链表上的各结点值
printf("输入要删除结点上的整数:\n");
scanf("%d",&num);
head = Delete_one_node(head,num);
// 删除链表上具有指定值的结点
Print(head);
node *p1 = (node *)malloc(sizeof(node));
p1-&data=4;
head = Insert(head,p1);
// 将新结点插入链表中
Print(head);
deletechain(head);
// 释放整个链表的结点空间
head = Create_sort();
// 产生一条有序链表
1,3,2,5,-1
Print(head);
deletechain(head);
// 释放链表上各结点占用的内存空间
其他相对复杂的知识,包括网上找到的较复杂的源代码,大家都可以用这种方式来学习。先看代码,理解,然后自己尝试step by step地实现,逐渐转换为自己的知识。20118 条评论分享收藏感谢收起查看更多回答1 个回答被折叠()(Treasure)
第三方登录:扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
哲学与生活怎么那么难学啊?觉得非常抽象,摸不着头脑
你猜我是谁丶0
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
哲学是一切学问之母,是对这个世界规律的描述和推测.只有足够的素材才能总结规律,如果本身所学的东西不多,想归纳也没有办法.所以你可以多看看书,或多观察思考生活中发生的事,多多对事物的发展进行推断.如果所有的推断都建立在理性的基础上,你推断的实践越多,思维就越严密,知道的东西的越多,触类旁通也越容易.你会发现哲学原来和自己的生活息息相关.
为您推荐:
其他类似问题
扫描下载二维码

我要回帖

更多关于 与抽象有关的数学思想 的文章

 

随机推荐