定义
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。
在稍复杂的线性表中,一个数据元素可由多个数据项(item)组成,此种情况下常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。
顺序表:只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以顺序表存储结构是一种随机存取的存储结构。由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。
分类
实现
顺序表
基本操作
/**
* 顺序表
* InitList(*L) 初始化
* LocateElem(L,e) 查找与e相同的元素,返回元素在表中序号
* ListInsert(*L,i,e) 第i个元素之前插入元素
* ListDelete(*L,i,*e) 删除L的第i个数据
* ListEmpty(L) 若为空,返回true
* ClearList(*L) 将L置为空表
* GetElem(L,i,*e) 第i个位置元素返回给e
*/
代码实现
main.c
#include <stdio.h>
#include "list.h"
void main()
{
int i,*e=0;
Sqlist L;
initList(&L);//初始化顺序表
for(i=0;i<15;i++) //循环插入i个元素
listInsert(&L,1,i);
//删除第5个位置的元素,并将该位置的元素赋值给e
listDelete(&L,5,&e);//指针作为参数传递,前面需加&
LocateElem(L,4);//查找与4相同的元素
/***************该线上方4个函数为核心函数,下方不重要***************/
for(i=0;i<L.length;i++)//循环输出顺序表
printf("%d ",L.elem[i]);
printf("
");
//listEmpty(L);//判断顺序表是否为空
//listClear(&L);//清空顺序表
destroyList(&L);//销毁顺序表
}
list.h
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct{
int *elem;
int length;
int listsize;
}Sqlist;
void initList(Sqlist *L)//构造顺序表
{
L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L->elem) printf("err");
L->length=0;
L->listsize=LIST_INIT_SIZE;
}
int listInsert(Sqlist *L,int i,int e)//在第顺序表i个位置之前插入e
{
int * newbase,j;
if(i<0||i>100) return 0;
if(L->length>=L->listsize)
{
newbase=(int *)realloc(L->elem,sizeof(int)*(L->listsize+LISTINCREMENT));
if(!newbase) return 0;
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
for(j=L->length-1; j>=i-1; j--)//注意区分顺序表的下标和数组的下标
L->elem[j+1] = L->elem[j];
L->elem[i-1] = e;
++L->length;
return 1;
}
int listDelete(Sqlist *L,int i,int *e)//删除顺序表第i个位置的值,并用e返回
{
// int p,q;
if(i<1||i>100) return 0;
*e=L->elem[i-1];
for(i;i<=L->length-1;i++)
L->elem[i-1]=L->elem[i];
L->length--;
return 1;
}
LocateElem(Sqlist L,int e) //查找与e相同的元素
{
int i;
for(i=0;i<L.length;i++)
{
if(L.elem[i]==e) {printf("有相同元素%d,在链表的第%d个位置
",e,i+1);break;}
}
if(i>=L.length) printf("没有相同元素
");
}
void destroyList(Sqlist *L)//销毁顺序表
{
if(L->elem) free(L->elem);
}
void listClear(Sqlist *L) //清空顺序表
{
int i;
int len=L->length;
for(i=0;i<len;i++)
{ L->elem[i]=L->elem[len];
L->length--;}
}
void listEmpty(Sqlist L) //判断顺序表是否为空
{
if(L.length==0) printf("线性表为空");
else printf("线性表中有%d个元素
",L.length);
}
单链表
#include<stdio.h>
#include <stdlib.h>
typedef struct
{
int data;
struct LNode *next;
}LNode,*LinkList;
void init(LinkList L)//初始化链表
{
int i;
LinkList p,q;
p=(LinkList)malloc(sizeof(LNode));
q=(LinkList)malloc(sizeof(LNode));
p->data=1;
p->next=L->next;
L->next=p;
q=p;
for(i=1;i<10;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=i+1;
p->next=NULL;
q->next=p;
q=p;
}
}
void convert1(LinkList L)//遍历链表
{
LinkList p=(LinkList)malloc(sizeof(LNode));
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
void insert(LinkList L,int pos,int e)//向链表第pos个位置插入元素e
{
LinkList p=(LinkList)malloc(sizeof(LNode));
LinkList q=(LinkList)malloc(sizeof(LNode));
int i=0;
p=L;
// if(!p||i>pos-1) {printf("err");return;}
while(p&&i<pos-1)
{
p=p->next;
i++;
}
q->data=e;
q->next=p->next;
p->next=q;
}
void delete1(LinkList L,int pos)//删除链表中第pos个元素
{
LinkList p=(LinkList)malloc(sizeof(LNode));
LinkList q=(LinkList)malloc(sizeof(LNode));
int i=0;
p=L;
while(i<pos-1)
{
p=p->next;
++i;
}
q=p->next;
p->next=q->next;
free(q);
}
void main()
{
int pos,e;
LinkList L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
init(L);
convert1(L);
while(~scanf("%d %d",&pos,&e)){
insert(L,pos,e);
// while(~scanf("%d",&pos))
// {delete1(L,pos);
convert1(L);}
}