线性结构

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

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

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

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

线性表(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. Array数组基本案例:图书基本录入输出系统

    import java.util.Scanner; public class ArrayTest{ public static void main(String args[]){ Scanner sc ...

  2. frontpage 正则 查找与替换

    frontpage正则查找替换 frontpage查找用{}[不是() ]来匹配pattern, 并获取这一匹配 替换时匹配的字符用\1 \2 \3表示 第 N 个标记表达式 \N 在“替换”表达式中 ...

  3. AJAX入门学习(转)

    一.基础概念 1.全称:Asynchronous.JavaScript.And.XML(异步的 JavaScript 和 XML). 2.定义: Ajax不是一个技术,它实际上是几种技术,每种技术都有 ...

  4. 免写前缀JS包--prefixfree.min.js--插件

    /** * StyleFix 1.0.3 & PrefixFree 1.0.7 * @author Lea Verou * MIT license */ (function(){functio ...

  5. java 项目request.getParameter("")接收不到值

    如果发现这个方法 以前能接收到参数,现在不能接收到参数的情况下 很有问题出来tocat 或许jak 的问题上, 换个低版本可能就好了

  6. NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别

    NET平台下的Excel编程|C#操作Excel|Application和ApplicationClass的联系和区别 1. Interop含义Interop是互操作的含义.Microsoft.Off ...

  7. (转)dedecms网页模板编写

    网页模板就是templets中的htm文件,所以编写模板就是要编写html.这篇文章不是关于标签的具体使用,而是对网页模板的一些理解.包括基本的标签语法,封面模板,列表模板和文档模板的关系. 一 关于 ...

  8. jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)

    首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...

  9. 12 Integer to Roman(int转罗马数字Medium)

    题目意思:1-3999转罗马数字 思路:从大往小减 ps:这题有点蛋疼 class Solution { public: string intToRoman(int num) { string a[] ...

  10. call和apply

    在js中经常会看到call和apply,他们实际上就是用于改变this的上下文 经典例子 function pet(words) { this.words=words; this.speak=func ...