1) 链表顺序存储---之二代码

参考文档:

1)《《大话数据结构》》

2)http://blog.chinaunix.net/uid-20680669-id-147844.html

3)http://blog.csdn.net/strommaybin/article/details/51919464

1. 线性表(list): 零个或多个数据元素的有限序列

线性表(Linear_list)是最常用也是最简单的数据结构。简言之,一个线性表是n个数据元素的有限序列。线性表是有线性结构的表。什么是线性结构呢?线性结构是n个数据元素的有序集合。它有四个基本特征: 
  1.集合中必存在唯一的一个”第一个元素”; 
  2.集合中必存在唯一的一个”最后的元素”; 
  3.除最后元素之外,其它数据元素均有唯一的”后继”; 
  4.除第一元素之外,其它数据元素均有唯一的”前驱”。 
  如(a1,a2,a3,…..,an),a1为第一个元素,an为最后一个元素,此集合极为一个线性结构的集合。 
  相对应于线性结构,非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱。 
  常用的线性结构有:线性表,栈,队列,双队列,数组,链表,串。

2.  功能及实现:

  1. 结构体的定义
  2. 初始化
  3. 尾部插入值为x的节点
  4. 打印各节点的值
  5. 判断节点是否为空
  6. 查找值为x的节点的位置
  7. 取得i节点的值
  8. 在i位置插入x值
  9. 删除i位置的节点
  1 typedef int Status;
  2
  3
  4 //1. 结构体的定义:
  5 #define MAXSIZE 100
  6 typedef int ElemType;
  7
  8 //结构体的定义
  9 typedef struct list
 10 {
 11     ElemType data[MAXSIZE];//数据
 12     int length ;            //线性表的当前长度
 13 } sqlist;
 14
 15
 16 //2. 初始化
 17 sqlist * init_sqlist()
 18 {
 19     //tmp=(TSeqList*)malloc(sizeof(TSeqList));//分配空间
 20     sqlist *list=(sqlist*)malloc(sizeof(sqlist));
 21     list->length=0;
 22     return list;
 23 }
 24
 25 //3.尾部插值
 26 int  insert_rear_sqlist(sqlist *list,ElemType data)
 27 {
 28     int ret=0;
 29     if(list->length==MAXSIZE||list->length==0)
 30     {
 31         ret=-1;
 32         printf("func insert_rear_sqlist erro: %d",ret);
 33         return -1;
 34     }
 35     list->length=list->length++;//长度+1
 36     list->data[list->length]=data;//插入数据
 37     return 0;
 38 }
 39
 40 // 4. 打印节点的值
 41 int print_sqlist(sqlist *list)
 42 {
 43     int ret=-1;
 44     if(list->length==0)
 45     {
 46         printf("\nThe list is empty: %d \n",ret);
 47         return ret;
 48     }
 49
 50     else
 51     {
 52         for(int i=0;i<list->length;i++)
 53             printf("%5d\n",list->data[i]);
 54     }
 55     return 0;
 56 }
 57
 58 //5. 判断是否为空
 59 int is_empty_sqlist(sqlist *list)
 60 {
 61     return list->length==0?0:1;
 62 }
 63
 64 //6. 查找值为x的节点的 位置(有问题 待改正)
 65 int find_num_sqlist(sqlist* list,ElemType data)
 66 {
 67     int ret=0;
 68     int temp=0;
 69     if(list->length==MAXSIZE||list->length==0)
 70     {
 71         ret=-1;
 72         printf("func insert_rear_sqlist erro: %d",ret);
 73         return -1;
 74     }
 75     for (int i=0;list->length<MAXSIZE;i++)
 76     {
 77         if(list->data[i]==data)
 78             temp=i;
 79     }
 80
 81     return temp;
 82 }
 83
 84 //7. 取得i节点的值
 85 int get_elem(sqlist *list,int i)
 86 {
 87     if(list->length<=0||i<0||i>list->length)
 88     {
 89         return -1;
 90     }
 91     return list->data[i];
 92 }
 93
 94 // 8.  在i位置插入e值
 95 int insert_list(sqlist *list,int i,ElemType e)
 96 {
 97     int k=0,ret=0;
 98     if(list->length==MAXSIZE)
 99     {
100         ret=-1;
101         printf("insert_list erro :%d ",ret);
102     }
103     if(i<0||i>list->length||list->length>MAXSIZE)
104     {
105         ret=-2;
106         printf("insert_list erro :%d ",ret);
107     }
108
109         for (k=list->length;k>=i;k--)
110         {
111             list->data[k]=list->data[k-1];//元素后移
112         }
113         list->data[i]=e;
114         list->length++;
115
116     return 0;
117 }
118
119 //9. 删除i位置的节点
120 int delete_list(sqlist *list,int i,ElemType *e)
121 {
122     int k=0;
123     int ret=0;
124     if(list->length==0)
125     {
126         ret=-1;
127         printf("delete_list erro: %d",ret);
128     }
129     if(i<0||i>list->length)
130     {
131         ret=-1;
132         printf("delete_list erro: %d",ret);
133     }
134 //    if(i<list->length)
135     //{
136         *e=list->data[i];
137         for(k=i;k<=list->length;k++)
138         {
139             list->data[k]=list->data[k+1];//元素前移
140         }
141     //}
142     list->length--;
143     return 0;
144 }
 ---------------------------------------

3. 测试代码

 1 int main()
 2 {
 3     int ret=0;
 4     int t1=1;
 5     int t2=2;
 6     int t3=3;
 7     int t4=4;
 8     int t5=5;
 9
10     //sqlist *list;
11     //void init_sqlist(sqlist *list)
12     sqlist *list=init_sqlist();
13
14     //cout<<sizeof(*list);
15     //int insert_list(sqlist *list,int i,ElemType e);
16     //1. 头插法
17     ret=insert_list(list,0,t1);
18     ret=insert_list(list,0,t2);
19     ret=insert_list(list,0,t3);
20     ret=insert_list(list,0,t4);
21     ret=insert_list(list,0,t5);
22
23     //2. 打印 遍历
24     //int print_sqlist(sqlist *list)
25     printf("插入数据: \n");
26     ret=print_sqlist(list);
27     int tmp=0;
28
29     //3. 删除链表中所有的节点
30     printf("\n删除节点数据: \n");
31     while(list->length>0)
32     {
33         //int delete_list(sqlist *list,int i,ElemType *e)
34         ret=delete_list(list,0,&tmp);
35         printf("%5d\n",tmp);
36     }
37
38     //5. 判断是否为空
39     //int is_empty_sqlist(sqlist *list)
40     ret=is_empty_sqlist(list);
41     printf("链表是否为空%5d\n",ret);
42
43     system("pause");
44     return 0;
45 }

4。 运行结果

时间: 2024-07-29 16:11:06

1) 链表顺序存储---之二代码的相关文章

用二叉链表实现二叉查找树(二)

/* 二叉查找树的链表实现: 以及三种遍历方式,删除节点: 查找节点: author:天下无双 Date:2014-5-28 Version:3.0 */ #include <iostream> #include <string> typedef int T;//树内节点的数据类型 using namespace std; class BiTree { private: struct BiNode{ T data; BiNode *lchild,*rchild; BiNode(T

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

JSqlParser系列之二代码结构(原)

JSqlParser系列之二代码结构(原) 博客园 百味木屋原创,转载请注明出处. 上一篇文章简单介绍如何建立JSqlParser工程,本章对JSqlParser工程的代码结构作大致地介绍. 一.目录结构 JSqlParser的目录结构比较简单,主要有表达式,解析器,语句处理几个目录.下面这张图给出了一个具体的SQL语句与表达式: 接下来,简要介绍一下在JSqlParser中几个抽象概念. 二.SQL语句(statement) JSqlPaser将所有的SQL语句抽象为Statement,Sta

【数据结构】单链表&amp;&amp;静态链表详解和代码实例

喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存储单元.当有节点插入时,系统动态的为结点分配空间.在结点删除时,应该及时释放相应的存储单元,以防止内存泄露.由于是链式存储,所以操作单链表时,必须知道头结点或者头指针的位置.并且,在查找第i个节点时,必须找到第i-1个节点. 1.2 单链表的存储结构代码描述 对于链式存储,通过上一节的讲解相信大家已

[程序员代码面试指南]链表问题-复制含有随机指针节点的链表(方法二待做)

问题描述 public class Node { public int val; public Node next; public Node rand; public Node(int data) { this.val=data; } } Node类中的value是节点值,next指针和正常单链表中next指针的意义一样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可能指向链表中的任意一个节点,也可能指向null. 给定一个由Node节点类型组成的无环单链表的头节点head,

[Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树

---恢复内容开始--- Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题目要求:转成高度平衡的二叉搜索树. 高度平衡的二叉搜索树:i)左子树和右子树的高度之差的绝对值不超过1; ii)树中的每个左子树和右子树都是AVL树; iii)每个节点都有一个平衡因子(balance factor bf),任一节点的平衡因子是1,0,

Android之高仿雅虎天气(二)---代码结构解析

版本已升级至1.0.1 源码地址: GitHub:https://github.com/way1989/WayHoo OsChina:http://git.oschina.net/way/WayHoo 本例使用了6个库代码和1个主工程代码. 一.6个库代码如下图所示: 其中 ①.MenuDrawer.ViewPagerIndicator.ShowcaseView.SwipeBack都是Github上有名的侧边栏菜单开源库,我这里未做修改,直接引用,感谢开源的力量. ②.PullToRefresh

多数组实现链表结构 c++实现代码

对每个属性使用一个数组表示,多数组可以表示一组同构的对象.指针放在额外的数组中,用下标来表示. 这次实现代码基于10.3-5, 主要为了实现compacitify 操作,即把链表的所有元素在存储器中保持紧凑,本题是都放到前n个位置(n个元素). 思想是从网上看来的,移动元素的过程中保持链表中元素的相互指向不变,而自由表中并不需要,因为它什么都没有存储. 这里实现了一个List_Freelist类,支持Delete,Insert,Compacitify,Print,Get_Next 等操作. #i

C语言单链表逆置的代码实现 (简单易懂版)

嗯,,这是自己写的第一篇博客哈,写的不好大家不要见怪,主要是想把自己的一些思想分享给大家.也欢迎大家指出错误,一同进步. 话不多说,直接先说想法.要把一个单链表逆置,可以大致分为下列几步.先创建一个链表.然后要考虑到链表的逆置实现.最后是链表的输出.有了这样过几步大概的想法之后,我们便要来一步步的实现啦.嗯,,创建链表就不说了,大家都会.  然后呢就是链表的逆置,这里我是采用的就地逆置法,,嗯,反正我是这么叫的,大家可以参考一下.当然啦,你得考虑到函数的形参和返回值以及指针的交接,这里如果出了问