数据结构如何建立1个线性表?

作者&投稿:漫帜 (若有异议请与网页底部的电邮联系)
C语言创建一个线性表,然后输出线性表~

#include
#include
#include

#defineOVERFLOW -2
#define OK 1
#define ERROR 0
#defineLIST_INIT_SIZE 100
#defineLISTINCREMENT 10

typedef intElemType;
typedef intStatus;
//定义顺序存储结构
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
//初始化顺序表
StatusInitList_Sq(SqList &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem ) exit(ERROR);
L.length =0;
L.listsize =LIST_INIT_SIZE;
return OK;
}
//自定义创建顺序表
voidCreate_SqList(SqList &L)
{
int c,i=0;
int *newBase;
printf("请输入顺序表元素:
");
while((scanf("%d",&c))!=EOF)
{
if(i>=L.listsize) //自定义顺序表大小超过初始化大小
{
newBase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
//为初始顺序表以LISTINCREMENT大小重新增加存储空间
if(!newBase)exit(OVERFLOW);
L.elem=newBase;
L.listsize+=LISTINCREMENT;
}
L.elem[i++]=c;
}
L.length=i;
printf("输入的顺序表元素:
");
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("
");
}
//在指定位置插入元素
StatusListInsert(SqList &L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
if(iL.length+1)
{
printf("插入位置错误
");
return(ERROR);
}
if(L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
if(i==L.length) L.elem[i+1]=e;
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
//在指定位置删除元素
StatusListDelete_Sq(SqList &L,int i,ElemType *e)
{
ElemType *p,*q;
if(iL.length+1)
return ERROR;
p=&(L.elem[i-1]);
*e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length ;
return OK;
}

void main()
{
SqList L;
int m,n;
int location,element;
if(!InitList_Sq(L))
{
printf("初始化顺序表失败!
");
exit(ERROR);
}
Create_SqList(L);
for(m=0;m<3;m++)
{
printf("输入插入位置:");
scanf("%d",&location);
while(location>L.length+1||location<1)
{
printf("输入位置错误,请重新输入!
");
scanf("%d",&location);
}
printf("插入元素:");
scanf("%d",&element);
if(!ListInsert(L,location,element))
{
printf("顺序表插入失败!
");
exit(ERROR);
}
printf("插入顺序表为:
");
for(int i=0;i<=L.length -1;i++)
{
printf("%d ",L.elem[i]);
}
printf("
新顺序表一共有%d个元素。
",L.length);
}
for(n=0;n<3;n++)
{
printf("输入删除位置:");
scanf("%d",&location);
while(location>L.length||location<1)
{
printf("输入位置错误,请重新输入!
");
scanf("%d",&location);
}
if(!ListDelete_Sq(L,location,&element))
{
printf("删除错误!
");
exit(ERROR);
}
printf("被删除的元素为:%d
",element);

printf("被删除后的顺序表为:
");
for(int j=0;j<=L.length-1;j++)
{
printf("%d ",L.elem[j]);
}
printf("
新顺序表一共有%d个元素。
",L.length);
}
}
这个是我最近编写的 顺序表也是线性表的
这里还有链表的程序 用的话再传给你

链表
1。是由结构体和指针构成的。
2。包括两个部分一个是数据域和指针域。
3。链表中的结点分为两类:头结点和一般结点。头结点是没有数据域的。
4。基本操作有:初始化链表,增加结点和删除结点,求链表的长度等等。
struct Linknode{
int data;
struct Linknode *next;
};
这个地方有个知识点:这个是链表的数据结构是有结构体和指针构成。结构体名为Linknode.但这里面没有定义结构体变量,只有我们定义了结构体变量才能使用结构体。
结构体变量怎么定义呢?
有两种方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我们都希望采用第2种,这样的好处是: 当我们再定义结构体变量时,可以用:Linklist p;而如果我们采用第一种还必须采用 struct Linknode p;对比一下就可以知道第2种要简单很多。那么下面我们都采用第2种方式来定义结构体变量。
上面我们已经定义了一个链表:
1。初始化链表。
#include
#include
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等于L,对与*Lnode的分配空间相当与对主函数中的L分配空间。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化链表的时候,我们用到了2级指针为什么呢?因为我们希望在InitLinkList函数生成的头结点,主函数中也能指向这个头结点。如果我们用一级指针的话,用malloc分配空间的时候,它将会返回分配空间的首地址给指针变量Lnode,而不能使是的空间被主函数中指针变量L得到这个地址。所以我们要用2级指针。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加链表结点
增加链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
break;
p=Lnode->next;//p指向头结点
//通过while循环和指针变量p定位要插入的结点q的位置。
while(p)
p=p->next;
//生成一个要插入的结点
q=(Linklist)malloc(sizeof(Linklist));//申请要插入的结点空间
q->data=d;//填充要插入结点的数据域
q->next=p->next;//首先填充要插入结点q的指针域进行填充。
p->next=q;//然后把定位好的p指针域进行修改指向q.

}while(9);//循环退出的条件是输入的数据-9999

}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
}
3。求链表的长度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向链表的第一个结点。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入一个结点
LengthLinkList(L)//求链表的长度。
}
4.删除结点
删除链表结点其实很简单,一般用到三个结构体指针变量和一个循环结构。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向链表的头结点
while(p)
{
q=p->next;//q指向当前结点的下一个结点。
free(p);//释放当前结点
p=q;//p指向下一个结点
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一个头结点
InsertLinkList(L);//插入结点
LengthLinkList(L)//求链表的长度。
DestroyLinkList(L);//删除链表结点
}

建立顺序表代码如下:

由数组元素a[0..n-1]创建顺序表L。将a中的每个元素依次放入顺序表中,并将n赋值给顺序表的长度域。算法为:

void CreateList(SqList * &L, ElemType a[], int n){

    int i=0, k=0;

    L = (SqList *)malloc(sizeof(SqList));    //分配存储线性表的空间

    while(i<n){

        L->data[k] = a[i];

        k++; i++;

    }

    L->length = k;        //设置线性表的实际长度,设置为k(即a的长度n)

}

扩展资料

线性表的特点:

1、对于同一个线性表,其每一个数据元素的值虽然不同,但必须具有相同的数据类型;

2、数据元素之间具有一种线性的或“一对一”的逻辑关系。

3、第一个数据元素没有前驱,这个数据元素被称为开始节点;

4、最后一个数据元素没有后继,这个数据元素被称为终端节点;

5、除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。

线性表的抽象数据类型描述

基本操作如下:

1、线性表的置空操作clear():将一个已经存在的线性表置为空表。

2、线性表判空操作isEmpty():判断线性表是否为空,若为空,则返回true;否则,返回为false。

3、求线性表的长度操作length():求线性表中的数据元素的个数并返回其值。



事实上在写线性表的基本操作时,就是用数组来描述它(线性表)的。
typedef struct {
int arr[MAX];//用的数组
int length;
} ArrayList;//线性表

void InitList(ArrayList *L);
void DestroyList(ArrayList *L);
int *GetElem(ArrayList *L, int i);
int ListInsert(ArrayList *L, int i, int e);
int ListDelete(ArrayList *L, int i);

如果固定此输入顺序,可以首先设定一个数组。采用循环依次输入数据,以-1为输入终止条件即可。

求构建一个线性表的完整程序 数据结构C语言版???
答:for(i=pL->len-1; i>=pos; i--)/*移动数据*/ pL->base[i+1]=pL->base[i];pL->base[pos]=d;/*写入数据*/ pL->len++;/*表长增1*/ } return flg;} /*把顺序表中指定序号的元素删除*/ BOOL ListDel(SeqList *pL, int pos){ BOOL flg=TRUE;int i;if(pos0 || pos>=...

【100分】数据结构——使用C语言(线性表)
答:define OVERFLOW 1 define OK 1 using namespace std;//c++的一个指令 typedef struct { int *elem; //存储空间基址 int length; //当前长度 int listsize;//当前分配的存储容量 // (以sizeof(ElemType)为单位)//int *next;}sqlist;void initList(sqlist &La){//构造一个空线性表L ...

建立一个线性表,从键盘输入数据元素
答:{ elemtype * list;int maxsize;int size;};//初始化表 int initlist(List L){ L.size = LIST_INIT_SIZE;L.list = (elemtype*)malloc(LIST_INIT_SIZE*sizeof(elemtype));return 0;} 接下来的要求是:建立一个含n个元素的线性表(数据从键盘输入)(使该表保持升序)应该怎么写,感激不尽...

怎么在数据结构中定义线性表
答:栈(stack)是限定只能在表的一端进行插入和删除操作的线性表。队列(queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除...

数据结构 线性表的操作
答:include<stdio.h> include<string.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> include<stdio.h> Status InitList_Sq(SqList&L){ //构造一个空的线性表 L.elem=(...

线性表的基本操作c语言实现
答:include "2_1.h"typedef unsigned int TSeqListNode;typedef struct { int len; //长度 int capacity;//总长度 TSeqListNode * node;//每个节点的指针 } TSeqList;int main(){ SeqList* list = SeqList_Create(5);//创建线性表 int i = 6;//赋值6个变量,已超过线性表最大值 5 i...

数据结构之线性表
答:N个数据元素的有限数列,一种最简单最常见的数据结构,比较复杂的线性表中一个数据元素可能包含多个数据项,这种情况下把数据元素称之为记录,包含大量记录的线性表称为文件。线性表的顺序表示和实现,是一种随机存取的存储结构。这种存储结构虽然可随机存取,但是删除和插入操作复杂,需要移动其他数据元素 ...

2022数据结构考研知识体系:线性表-线性表的定义和基本操作
答:(4)表中元素的数据类型都相同,即每个元素占有相同大小的存储空间;(5)表中元素具有抽象性,仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是存储结构,不是同一个概念!!!二、线性表的基本操作 最基本操作:增删改查...

数据结构中关于顺序结构中的线性表的建立怎么写
答:typedef struct{ int *elem;int len;int listsize;}sqlist;sqlist creat(){ //这只是建立的方法,主函数自己写吧 sqlist L;int n;printf("请输入线性表元素的个数:\n");scanf("%d",&n);L.elem=(int*)malloc(ls*sizeof(int));L.len=n;L.listsize=ls;return L;} ...

数据结构笔记(四)——线性表
答:前面说过,数据结构的类型大方向上来说分为 线性结构 和 非线性结构 ,下面要说的线性表就是线性结构的一种。 (复习一下,前面说过的线性结构有:线性表、栈、队列、字符串、数组和广义表) 上一行是课本上的原话,但是感觉这个在逻辑上有一些不清楚的地方,先忘掉上一行的东西吧,看完下面的...