(线性结构)循环链表的初始化,增删减除结点。新手的了解

1.查找rear指针为O(1) 那么开始节点就为rear->next->next,也是O(1)   //大家可以想象从最后一个结点开始有什么好处
2.head->next ==head 判断是否空表

//链表的定义
typedef struct CLinkList
{
    ElemType data;
    struct CLinkList;
 } node ;
 
 1 //插入结点
 2  void ds_insert (node **pNode,int i)
 3  {
 4     node *temp;
 5     node *target;
 6     node * p;
 7     ElemType item;
 8     int j=1;
 9     printf("输入要插入结点的值:");
10     scanf ("%d",&item);
11
12 //插入的节点为头节点
13     if (i==1)
14     {
15         temp=(*node)malloc(sizeoof (struct CLinkList));
16
17         if (!temp)
18            exit (0);
19
20            temp->date =item;
21
22                for(target = (*pNode); target->next !=(*pNode); target =target->next);//如果next不是指向头,不断循环
23
24                temp->next = (*pNode);
25                target -> next = temp;
26                *pNode = temp;  //插入的结点为头节点,不要漏写
27
28      }
29
30      else
31      {
32          target =*pNode;
33
34         for (;j<(i-1);++j)   //循环到要插入的位置
35         {
36             target =target->next;
37          }
38          temp =(node*)malloc(sizeoof (struct CLinkList));
39
40          if (!temp)
41              exit(0);
42
43              temp -> data = item;
44
45              p=target -> next;        //p先存放要插入位置节点的后一个元素的地址
46              target -> next = temp;   //当前结点指向新插入的节点
47              temp -> next = p;        //新节点指向本来要插入位置元素的后一个结点
48      }
49  }

 1 //删除节点
 2  void  ds_detele (node **pNode,int i)
 3  {
 4      node  *target;
 5      node  *temp;
 6      int j=1;
 7      if (i==1)
 8      {
 9            for(target = (*pNode); target->next !=(*pNode); target =target->next);//如果next不是指向头,不断循环
10
11         temp = *pNode;
12
13         *pNode =(*pNode)->next;  //因为删除第一个节点,所以把第二个节点赋值给第一个节点,*pNode始终指向第一个节点,
14         target->next =*pNode;    //把末节点指向首节点
15
16         free(temp);             // 释放原来的第一个节点
17      }
18      else
19      {
20          target=*pNode;
21
22          for (;j<i-1;++j)   //找出要删除的节点 的前一个节点
23            {
24                target =target->next;
25            }
26
27
28         temp=target->next;
29         target->next=temp->next;  // 这两句等于target=target->next->next
30
31         free(temp);
32      }
33  }

图片是自己整理思路写出来的,比较丑,以后写好点

 1 //返回节点的所在的位置
 2 int ds_search(node *pNode,int elem)
 3 {
 4     node *target;
 5     int i=1;
 6     for (target =pNode;target->datadate !=elem && target->next!=pNode;++i)
 7     {
 8         target =target->next;
 9      }
10
11      if (target->next ==pNode)
12           return 0;
13
14      else
15           return i;
16 }

返回节点比较简单,大家看看就会

 1 //初始化循环链表
 2 void ds_init (node **pNode)
 3 {
 4     int item;
 5     node *temp;
 6     node *target;
 7     printf("输入节点的值,输入0完成初始化\n");
 8
 9     while (1)
10     {
11         scanf ("%d",&item);
12         fflush(stdin);  //清除缓冲区,为了不影响下个数的输入
13
14         if(item==0)
15            return ;
16
17          if(*pNode==NULL)
18          {
19           //循环链表只有一个节点
20           *pNode =(node*)malloc(sizeof (struct CLinkList));
21
22            if(!*pNode)   //分配空间失败,错误退出
23               exit (0);
24
25               (*pNode)->data = item ;
26               (*pNode)->next = *pNode;    //让尾节点指向头节点
27           }
28
29          else
30          {
31              //找到next指向的第一个结点的结点
32              for(target = (*pNode); target->next !=(*pNode); target =target->next);//如果next不是指向头,不断循环
33
34              temp=(*node)malloc (size(struct CLinkList));
35
36              if (!temp)
37                 exit(0);
38
39             temp->data =item ;
40             temp->next =*pNode;
41             target->next=temp;
42
43
44          }
45
46 }

感觉不太难,大家琢磨琢磨就会,大家可以写个解决约瑟夫问题的小程序,挺好玩了。

时间: 2024-10-26 23:05:46

(线性结构)循环链表的初始化,增删减除结点。新手的了解的相关文章

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

2、线性结构——数据结构【基础篇】

线性结构 线性结构的4大特点: 1.有一个结点只有前驱 2.有一个结点只有后继 3.其他结点既有一个前驱也有一个后继 4.在逻辑上相邻在物理上也相邻数据的逻辑关系叫做线性结构 线性结构的3大类型: 1.线性表--线性表是n个数据元素的有限序列 存储结构: 顺序存储对应一组操作:顺序表 链式存储对应一组操作:单向链表.双向链表.循环链表 2.栈--限定只在表的一端(表尾)进行插入和删除操作的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),其这一端被固定了. 存储结构

线性结构

线性表及其实现 [引例]:多项式的表示 一元多项式:f(x)=a0+a1X+...+an-1Xn-1+anXn 主要运算:多项式的相加.相减.相乘等. [分析]如何表示多项式? 多项式的关键数据: 多项式的项数n 各项系数ai及指数i 方法1:顺序存储结构直接表示 数组各分量对应多项式的各项: a[i]:项Xi的系数ai,i是对应的指数 例如:f(x)=4x5-3x2+1,表示成:  0  1   2   3  4  5    ......    下标i 1 0 -3 0 0 4 ......

poj 3666 Making the Grade (线性结构上的DP )

题意: 给定n个数,问你将他们修改成非增或非减序列的最小花费.最小花费的定义是 假设原数组为 a[1] a[2] a[3] .... a[n] 修改后数组为 b[1] b[2] b[3] .... b[n] 那么最小花费为|a[1]-b[1]|+|a[2]-b[2]|+| a[3] - b[3] |+.....| a[n] - b[n] |. 思路: 线性结构上的动态规划 定义状态d[i][j] 表示 前i-1个数字已经是最小花费 现在把第i个数修改成b[j] 修改完成后前i个数总共最少需要的花

Mooc数据结构-基础和线性结构

1 数据结构 解决问题方法的效率,跟数据的组织方式有关 解决问题方法的效率,跟空间的利用效率有关 解决问题方法的效率,跟算法的巧妙程度有关 数据结构 数据对象在计算机中的组织方式 逻辑结构 物理存储结构 数据对象必定与一系列加在其上的操作相关联 完成这些操作所用的方法就是算法 抽象数据类型(Abstract Data Type) 数据类型 数据对象集 数据集合相关联的操作集 抽象: 描述数据类型的方法不依赖与具体实现 与存放数据的机器无关 与数据存储的物理结构无关 与实现操作的算法和编程语言无关

【算法和数据结构】_17_小算法_线性结构:顺序表

/* 本程序用来测试数据结构中的线性结构:顺序表 */ #include <stdio.h> #include <stdlib.h> #define LINEAR_MAX_SIZE 64 struct LinearList { int* List; //顺序表指针 unsigned short int ListLen; //顺序表最大的元素个数 unsigned short int CurrentLen; //顺序表当前元素的个数 }; typedef struct LinearL

13. C#数据结构与算法 -- 线性结构

本文中,我们讨论了三个部分的内容: 什么是线性结构,线性结构有哪些特点 . 详细介绍了一个最简单线性结构顺序表,并且通过源代码进行一些的分析. 最后还举了一个例子,让我们更好的理解顺序表. 第一部分:什么是线性结构,线性结构有哪些特点 什么是线性结构,线性结构是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这 种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素

数据结构第二讲:线性结构

参考:浙大数据结构(陈越.何钦铭)课件 1.线性表及其实现 有一个很好的问题可以方便的说明引入链表的好处,那就是一元多项式:f(x) = a0 + a1x + an-1xn-1 + anxn 的表示及运算(两个多项式相加/相减/相乘等),显然我们可以利用数组来解决这个问题,两个多项式相加就是两个数组对应分量相加.但是这引入了一个很严重的问题,如何表示多项式x + 3x2000呢?开这么大的数组明显会造成空间浪费. 解决上面遗留的问题的一个方法是用结构数组按指数大小有序存储,每一个数组元素维护两个

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外