线性结构

  ①存在一个唯一的被称为“第一个”的数据元素;

  ②存在一个唯一的被称为“最后一个”的数据元素;

  ③除第一个元素外,每个元素均有唯一一个直接前驱;

  ④除最后一个元素外,每个元素均有唯一一个直接后继

线性表(Linear List)

  是由n(n≧0)个数据元素(结点)a1,a2,…an组成的有限序列。该序列中的所有结点具有相同的数据类型。其中数据元素的个数n称为线性表的长度。

  当n=0时,称为空表。

  当n>0时,将非空的线性表记作:(a1,a2,…an) ,a1称为线性表的第一个(首)结点,an称为线性表的最后一个(尾)结点。

顺序存储:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。

#ifndef _TYPE_H_
#define _TYPE_H_ #include<stdio.h>
#include<stdlib.h>
#include<string.h> #define TRUE 1
#define FALSE 0
#define INIT_SIZE 20
#define INCREMENT 10
#define OVERFLOW -2 typedef int Boolean;
typedef char ElemType; #endif

type.h

/********************************************************
Author: ydp Version: 1.0 Date: 2013/05/03
File name: SqList.c
Description:
sequence list.
Function List:
init():
History:
none
*********************************************************/
#include "type.h" typedef struct ArrayList
{
ElemType *elem;
int length;
int size;
}SqList; Boolean initList(SqList *L);
Boolean insertList(SqList *L,ElemType elem, int pos);
Boolean delList(SqList *L,int pos);
Boolean updateList(SqList *L,ElemType elem, int pos);
int findList(SqList *L,ElemType elem);
Boolean destroyList(SqList *L); int main(void)
{
SqList L,*p;
p=&L;
Boolean flag = initList(&L);
ElemType e = 'y';
flag = insertList(&L,e,);
e = 'p';
insertList(&L,e,);
e = 'd';
insertList(&L,e,);
printf("before delete:\t%s\n",p->elem);
delList(&L,);
printf("L->elem:\t%s\n",p->elem);
printf("L->elem[0]:\t%c\n",p->elem[]);
printf("L->size:\t%d\n",p->size);
printf("L->length:\t%d\n",p->length);
insertList(&L,e,);
updateList(&L,'y',);
printf("after update:\t%s\n",p->elem);
int pos = findList(&L,'p');
printf("pos:\t%d\n",pos);
destroyList(&L);
if(p->elem==NULL)
{
printf("L->elem==NULL\n");
}
return ;
} Boolean initList(SqList *L)
{
printf("Init sqList start!\n");
L->elem = (ElemType *)malloc(INIT_SIZE*sizeof(ElemType));
if(L->elem==NULL)
{
printf("Init sqList false!\n");
exit(OVERFLOW);
} L->length = ;
L->size = INIT_SIZE;
printf("Init sqList success!\n");
return TRUE;
} Boolean insertList(SqList *L,ElemType elem,int pos)
{
printf("Insert list start!\n");
if(L->elem==NULL)
{
printf("List is not init!\n");
initList(L);
}else if(L->length >= L->size)
{
L->elem = (ElemType *) realloc (L->elem,(L->size+INCREMENT)*sizeof(ElemType));
L->size = L->size + INCREMENT;
if(L->elem == NULL)
{
exit(OVERFLOW);
}
}
if(pos< || pos > L->length+)
{
printf("Error position!");
return FALSE;
}
if(L->length > )
{
int len=L->length-;
for(len ; len>=pos- ; len--){
L->elem[len+]=L->elem[len];
}
}
L->elem[pos-] = elem;
++L->length;
printf("Insert list success: %c\n",elem);
return TRUE;
} Boolean delList(SqList *L, int pos)
{
if(pos > L->length || pos < )
{
printf("del error position!");
return FALSE;
}
for(;pos<=L->length;pos++)
{
L->elem[pos-]=L->elem[pos];
}
L->length--;
return TRUE;
}
Boolean updateList(SqList *L,ElemType elem, int pos)
{
if(pos< || pos >= L->length)
{
printf("Update elem error place!");
return FALSE;
}
L->elem[pos-]=elem;
return TRUE;
} int findList(SqList *L,ElemType elem)
{
if(L->elem == NULL)
{
return -;
}
int i=;
for(;i<L->length;i++)
{
if(elem == L->elem[i])
return i+;
}
return -;
} Boolean destroyList(SqList *L)
{
if(L->elem)
{
free(L->elem);
L->elem=NULL;
printf("Destroy line list success! \n");
}
}

SqList.c

链式存储

#ifndef _LIST_H_
#define _LIST_H_ #define TRUE 1
#define FALSE 0
#define OVERFLOW -2 typedef int Boolean;
typedef char ElemType; typedef struct ListNode
{
ElemType elem;
struct ListNode *next;
}LNode; Boolean isEmpty(LNode *node);
void print(LNode *node);
void addList_tail(LNode *node,int num);
void addList_head(LNode *node,int num);
ElemType getElem(LNode *L,int i);
int locateElem(LNode *L, ElemType key);
Boolean insertElem(LNode *L, ElemType key, int addr);
Boolean modifyElem(LNode *L, ElemType key, int addr);
Boolean deleteElem(LNode *L, int addr);
#endif

list.h

#include"list.h"
#include<stdio.h>
#include<stdlib.h> int main(void)
{
LNode *p,*head;
head=p=(LNode *)malloc(sizeof(LNode));
head->next=NULL;
if(isEmpty(p)){
printf("List is null\n");
}else {
printf("List is not null\n");
}
addList_tail(head,);
// addList_head(head,5);
print(head);
ElemType e = getElem(head,);
printf("getElem(2)=%c\n",e);
int add = locateElem(head,'f');
printf("locateElem(f)=%d\n",add);
if(insertElem(head,'i',)){
printf("insert(head,'i',2) sucess!\n");
}else{
printf("insert(head,'i',2) fail!\n");
}
print(head);
if(modifyElem(head,'h',)){
printf("modifyElem(head,'h',1) success! \n");
}else{
printf("modifyElem(head,'h',1) success! \n");
}
print(head);
if(deleteElem(head,)){
printf("deleteElem(head,1) sucess!\n");
}else{
printf("deleteElem(head,1) sucess!\n");
}
print(head);
} Boolean isEmpty(LNode *node){
if(node->next != NULL){
return FALSE;
}
return TRUE;
} void print(LNode *node){
while(node->next != NULL){
node=node->next;
printf("elem:%c\n",node->elem);
}
} void addList_tail(LNode *node,int num){
LNode *p,*q;
int i;
p=node;
char e;
printf("will input %d elem!",num);
for(i=;i<=num;i++){
q=(LNode *)malloc(sizeof(LNode));
printf("\nplease input the %dth elem:",i);
scanf("%c",&e);
//The follow 2line is clear ‘'\n' in memery
int c;
while ((c=getchar()) != '\n' && c != EOF);
//fflush(stdin);
q->elem=e;
q->next=p->next;
p->next=q;
p=q;
}
} void addList_head(LNode *node,int num){
LNode *p,*q;
int i;
p=node;
char e;
printf("will input %d elem!",num);
for(i=;i<=num;i++){
q=(LNode *)malloc(sizeof(LNode));
printf("\nplease input the %dth elem:",i);
scanf("%c",&e);
int c;
while ((c=getchar()) != '\n' && c != EOF);
q->elem=e;
q->next=p->next;
p->next=q;
//p=q;
}
} ElemType getElem(LNode *L,int i)
{
int count=;
LNode *p;
p=L;
for(;count<i;count++)
{
if(p->next!=NULL){
p=p->next;
}
else
{
printf("out of boundry!");
return ;
}
} return p->elem;
} int locateElem(LNode *L, ElemType key)
{
int count=;
LNode *p;
p=L;
while(p->next != NULL)
{
p=p->next;
count++;
if(p->elem == key)
return count;
}
return -;
} Boolean insertElem(LNode *L, ElemType key, int addr)
{
LNode *p,*q;
p = L;
int count;
for(count=;count<addr;count++)
{
if(p->next != NULL)
p=p->next;
else
{
printf("Wrong addr!");
return FALSE;
}
}
q=(LNode *)malloc(sizeof(LNode));
q->next = p->next;
p->next = q;
q->elem = key; return TRUE;
}
Boolean modifyElem(LNode *L, ElemType key, int addr)
{
LNode *p;
p=L;
int count;
for(count=;count<addr;count++)
{
if(p->next != NULL)
p=p->next;
else
{
printf("Wrong addr!");
return FALSE;
}
}
p->elem = key;
return TRUE;
}
Boolean deleteElem(LNode *L, int addr)
{
LNode *p,*q;
p=L;
int count;
for(count=;count<addr-;count++)
{
if(p->next != NULL)
p=p->next;
else
{
printf("Wrong addr!");
return FALSE;
}
}
q = p->next;
p->next = q->next;
free(q);
return TRUE;
}

list.c

线性表(gcc实现)的更多相关文章

  1. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  2. C语言 线性表 链式表结构 实现

    一个单链式实现的线性表 mList (GCC编译). /** * @brief 线性表的链式实现 (单链表) * @author wid * @date 2013-10-21 * * @note 若代 ...

  3. C语言 线性表 顺序表结构 实现

    一个能够自动扩容的顺序表 ArrList (GCC编译). #include <stdio.h> #include <stdlib.h> #include <string ...

  4. <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现

    栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...

  5. DataStructure之线性表以及其实现

    线性表 应用:多项式的表示 什么是线性表 多项式表示问题给出的启示: 同一个问题可以有不同的表示(存储)方法 有一类共性问题 : 有序线性序列的租住和管理 “线性表(Linear List)” : 由 ...

  6. 线性表Linearlist

    顺序存储,链式存储,索引存储,散列存储 基本运算 SLIST         1.置空表 void SetNull(&L)     2.求长度 int Length(L)     3.取元素 ...

  7. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  8. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  9. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

随机推荐

  1. MIUI6&7桌面角标开源代码简介

    MIUI6&7桌面角标开源代码简介 MIUI6&7上重新设计了桌面app图标的角标显示,基本规则如下: 一.基本介绍 1.默认的情况 当app 向通知栏发送了一条通知 (通知不带进度条 ...

  2. HDU 4455(dp)

    题意:给定一个序列ai,个数为n.再给出一系列w:对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数. 思路:动态规划,用dp[w]表示当前长度为w的时候的权值和.显 ...

  3. RxJava 教程-1 简介 原理 线程控制 变换

    简介 RxJava 是什么? RxJava 在 GitHub 主页上的自我介绍是 RxJava is a Java VM implementation of ReactiveX: a library ...

  4. ASP.NET-FineUI开发实践-17

    我又不用FineUI开发,所以FineUI项目经验等于0,最近在忙别的,所以也没工夫研究.积累了论坛和群里的问题,写下来留个备份 1.在grid可编辑单元格中,如果需要在点击该单元格时,单元格中所有文 ...

  5. 解决第三方DLL没有强签名

    -----转载:http://blog.csdn.net/zyming0815/article/details/5939090 创建一个新的随机密钥对:sn -k myTest.snk 第一步: 将D ...

  6. Qt零基础教程(四)QWidget详解(3):QWidget的几何结构

    Qt零基础教程(四)  QWidget详解(3):QWidget的几何结构 这篇文章里面分析了QWidget中常用的几种几何结构 下图是Qt提供的分析QWidget几何结构的一幅图,在帮助的 Wind ...

  7. Linux(Debian)上安装Redis教程

    -- 第一步下载文件到该目录 cd /usr/local/src wget http:.tar.gz 解压 tar xzf redis.tar.gz -- 第二步编译安装 make make all ...

  8. ActiveX控件资料

    Visual Studio 2008(c#)开发ActiveX控件及制作CAB包总结(1) 分类: C#2011-05-27 15:50 403人阅读 评论(0) 收藏 举报 c#stringhook ...

  9. [OSGI]Eclipse4.2 OSGI依赖Bundle

    Eclipse 4.2 OSGI 依赖的Bundle: org.eclipse.osgiorg.apache.felix.gogo.runtimeorg.apache.felix.gogo.comma ...

  10. Python自动化运维之19、Paramiko模块和堡垒机实战

    paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...