055.链表操作(2)

简介: 055.链表操作(2)
#include "stdafx.h"
#include "stdio.h"
#ifndef SQLIST_H
#define SQLIST_H
#include <stdlib.h>
#define List_INIT_SIZE  100   //线性表的存储空间初始大小
#define LIST_INCREMENT  10    //分配增量
#define OVERFLOW   -2
#define OK     1
#define ERROR    -1
#define TRUE    1
#define FALSE    0
typedef int  ElemType;
typedef struct{
  ElemType *elem;  //存储空间基址
  int   length;  //当前长度
  int   size;    //当前存储容量(sizeof(ElemType)为单位)
}SqList;
int InitList(SqList &L)
{
  //构建一个线性表L
  L.elem = (ElemType*)malloc(List_INIT_SIZE*sizeof(ElemType));
  if(!L.elem)
  {
    exit(OVERFLOW);
  }
  L.length = 0;
  L.size = List_INIT_SIZE;
  return OK;
}//InitList
void DestoryList(SqList &L)
{
  if(!L.elem)
  {
    delete L.elem;
    L.elem = NULL;
  }
  L.length = 0;
  L.size = 0;
}//DestoryList
void ClearList(SqList &L)
{
  L.elem = NULL;
  L.length = 0;
  L.size = List_INIT_SIZE;
}//ClearList
int ListEmpty(SqList L)
{
  if(L.length > 0)
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}//ListEmpty
int ListLength(SqList L)
{
  return L.length;
}//ListLength
int ListInsert(SqList &L, int i, ElemType e)
{
  if(i<1 || i>ListLength(L)+1) //需满足条件1<i<ListLength(L)+1
  {
    return ERROR;
  }
  ElemType * NewBase;  //新的基址
  if(L.length > L.size) //空间已满
  {
    NewBase = (ElemType*)malloc((L.size+LIST_INCREMENT)*sizeof(ElemType));  //申请新的空间
    if(!NewBase)
    {
      exit(OVERFLOW);
    }
    L.elem = NewBase;
    L.size +=LIST_INCREMENT;
    delete NewBase;
    NewBase = NULL;
  }
  ElemType *p;
  ElemType *temp;
  p = &(L.elem[i-1]);  //取得i的位置,即插入位置
  for(temp = &(L.elem[L.length-1]);temp>p;--temp)  //将插入点后的所有元素向后移动一位
  {
    *(temp+1) = *temp;
  }
  *p = e;
  ++L.length;
  return OK;
}//ListInsert
int ListDelete(SqList &L, int i, ElemType &e)
{
  if (i<0 || i>ListLength(L)) {
    return ERROR;
  }
  ElemType *p;
  p = &(L.elem[i-1]);
  e = *p;
  ElemType *pos;
  pos =&(L.elem[L.length-1]);
  for(++p; p<=pos; ++p){
    *(p-1) = *p;
  }
  --L.length;
  return OK;
}
#endif //SQLIST_H
int main(){
  SqList list;
  ElemType e;
  InitList(list);
  ListInsert(list, 1, 1);
  ListInsert(list, 2, 2);
  ListInsert(list, 3, 3);
  ListInsert(list, 4, 4);
  ListInsert(list, 5, 5);
  for(int i =0; i<list.length; i++){
    printf("%d\n",list.elem[i]);
  }
  ListDelete(list, 2, e);
  for(i =0; i<list.length; i++){
    printf("%d\n",list.elem[i]);
  } printf("%d\n", list.length);
  return 1;
}
相关文章
|
缓存 DataX
部分链表操作总结
部分链表操作总结 #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; // definition of Node struct Node { int val; Node *next; Node(int x) : val(x), next(NULL){} };
776 0
|
存储
链表(一) 单链表操作详解
链表(一) 单链表操作详解
65 0
|
存储 Java
java实现双向循环链表(循环双链表)
线性表是我们最常用的一种数据结构,线性表包含顺序表和链表,顺序表典型应用就是我们常用的ArrayList,链表的典型应用其中就有我们常用的LinkedList。LinkedList他的底层就是使用链表来存储数据元素的。这篇文章用以总结链表中的双向循环链表,为单链表的结点增加一个指向前驱的指针域,单链表就变成了双链表,将双链表的头尾相连,双链表就成了双向循环链表。
326 0
|
存储 机器学习/深度学习 测试技术
C/C++中对链表操作的理解&&实例分析
链表概述   链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。
823 0
|
算法
数据结构实践——循环双链表应用
本文针对数据结构基础系列网络课程(2):线性表的实践项目。 【项目- 循环双链表应用】   设非空线性表ha和hb都用带头节点的循环双链表表示。设计一个算法Insert(ha,hb,i)。其功能是:i=0时,将线性表hb插入到线性表ha的最前面;当i&gt;0时,将线性表hb插入到线性表ha中第i个节点的后面;当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的
1114 0
带头循环双向链表详解 1
带头循环双向链表详解