线性结构

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

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

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

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

线性表(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. NYOJ 1107 最高的奖励(贪心+优先队列)

    最高的奖励 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时 ...

  2. python运算符使用规律

    #conding=utf-8 #优先级使用规律#1.一般情况下是左右结合print 4+6+5*6+6 #2.出现赋值的时候一般是右结合a=8+91print a #优先级记忆口诀'''函数寻址下标1 ...

  3. Iframe之间及iframe与父窗体之间值的传递

    方法一:ScriptManager.RegisterClientScriptBlock(this,typeof(Page), "NoInformation", "wind ...

  4. gis-矢量与栅格数据结构的比较

    2.5矢量与栅格数据结构的比较 在计算机辅助制图和地理信息系统发展早期,最初引用的是矢量处理技术,栅格数据处理始于70年 代中期.几年以前,这两种数据结构势不两立,很难兼容,因此给数据利用带来许多不便 ...

  5. 【转】block一点也不神秘————如何利用block进行回调

    我们在开发中常常会用到函数回调,你可以用通知来替代回调,但是大多数时候回调是比通知方便的,所以何乐而不为呢?如果你不知道回调使用的场景,我们来假设一下: 1.我现在玩手机 2.突然手机没有电了 3.我 ...

  6. delphi服务程序(service)的调试方法

    方法一: 1.调试delphi 写的服务程序,有这么一个办法.原来每次都是用attach to process方法,很麻烦.并且按照服务线程的执行线路,可能会停不到想要的断点.笨办法是,在proced ...

  7. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. jquery 插件大全

    1.jquery.roundabout.js 超棒的左右3D旋转式幻灯片jQuery插件 2.jquery validate.js 验证表单 3.jquery ui插件 对话框 日期 4.lhgdia ...

  9. C++的类为什么要用指针

    这个问题原来是这样的: C++的对象和C#不同,C++的对象是放在栈区的,C#的对象是引用类型. 这就意味着,C++进行类型转换的时候,由于调用了复制构造函数,其转换后,对象会丢弃一部分信息. 派生类 ...

  10. 线程间操作无效: 从不是创建控件“textBox2”的线程访问它

    如何:对 Windows 窗体控件进行线程安全调用 线程间操作无效: 从不是创建控件的线程访问它的三种方法 如果使用多线程处理来提高 Windows 窗体应用程序的性能,则你必须确保以线程安全的方式调 ...