① 用c语言编写程序实现线性表的顺序存储结构并实现以下功能: 1. 输入一组整数构造线性表;
比如你要在第i个元素之后插入,就把i+1直到最后一个元素依次向后移动一位,再把你要放的元素放到第i+1位置即可
② c语言实现线性表的顺序存储结构
#include "stdio.h"
#include "stdlib.h"
int main()
{ int a[10],i,j,k,t,x;
for(i=0;i<9;i++)
a[i]=rand()%100; //给数组赋随机值范围0-100
for(i=0;i<8;i++) //数组从小到大排序
for(j=i+1;j<9;j++)
if(a[i]>a[j])
{ t=a[i];a[i]=a[j];a[j]=t;
}
//输出一维数组中的数
for(i=0;i<9;i++)
printf("%d ",a[i]);
printf("\n");
//向数组插入一个数x
scanf("%d",&x);
if(x>a[8]) a[9]=x;
else if(x<a[0])
{
for(i=9;i>0;i--)
a[i]=a[i-1];
a[0]=x;
}
else
{for(i=0;i<8;i++)
if(x>a[i]&&x<a[i+1]) k=i+1;
for(j=9;j>k;j--)
a[j]=a[j-1];
a[k]=x;
}
//输出插入后的数组
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
//删除数组中的一个元素
//输入要删除的元素的下标
scanf("%d",&k);
for(i=k;i<10;i++)
a[i]=a[i+1];
//输出删除后的数组
for(i=0;i<9;i++)
printf("%d ",a[i]);
printf("\n");
}
③ 数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初
直接上源码吧。
/*线性表功能的实现*/
#include<stdio.h>
//定义常量 存储空间的初始化分配
#define MAXSIZE 20
#define TRUE 1
#define ERROR -1
#define FALSE 0
#define OK 1
//用typedef定义类型
typedef int Status;
typedef int ElemType;
//定义一个结构体类型
typedef struct{
ElemType data[MAXSIZE];
int length;
} sqlist;
//初始化函数
Status initList(SqList *L){
L->length = 0;
return OK;
}
//返回线性表的长度
Status getListLength(SqList L){
return L.length;
}
//线性表为空返回true,否则返回false
Status listEmpty(SqList L){
if(L.length == 0){
return TRUE;
}
return FALSE;
}
//线性表清空,长度为0
Status clearList(SqList *L){
L->length = 0;
return OK;
}
//获取指定的元素的值,返回下标为i - 1的元素,赋值给e
Status getElem(SqList L, int i, ElemType *e){
//判断元素位置是否合法[i]
if(i > L.length || i < 1){
printf("查找的位置不正确 \n");
return ERROR;
}
//判断线性表是否为空
if(listEmpty(L)){
return ERROR;
}
*e = L.data[i - 1];
return OK;
}
//在线性表中查找指定的e相等的元素,如果查找成功,返回该元素的下标,否则返回ERROR
Status locateElem(SqList L, ElemType e){
int i;
for(i = 0; i < L.length - 1; i++){
if(L.data[i] == e){
return i;
}
}
printf("没有查找到元素 %d 指定的下标\n",e);
return ERROR;
}
//自动创建 MAXSIZE 个元素,并赋值为0
Status createList(SqList *L){
int i;
for(i = 0; i < 10; i++){
L->data[i] = 0;
}
L->length = 10;
return OK;
}
//在线性表中第i个位置前插入新元素e
Status listInsert(SqList *L, int i, ElemType e){
//判断长度是否可以允许插入新的数据
if(L->length >= MAXSIZE){
printf("空间已满,不能再插入数据\n");
return FALSE;
}
//判断插入位置的合法性
if(i < 1 || i > L->length) {
printf("插入位置不正确\n");
return FALSE;
}
int j;
for(j = L->length - 1; j >= i; j--){
L->data[j] = L->data[j - 1];
}
L->data[i - 1] = e;
L->length++;
return TRUE;
}
//删除线性表中第i个元素,成功后表长减1,用e返回其值
Status deleteList(SqList *L, int i, ElemType *e){
//判断线性表是否为空
if(listEmpty(*L)){
return ERROR;
}
//判断删除的位置是否合法
if(i < 1 || i > L->length) {
printf("删除位置不合法\n");
return ERROR;
}
*e = L->data[i - 1];
for(i; i < L->length; i++){
L->data[i - 1] = L->data[i];
}
L->length--;
return TRUE;
}
//遍历线性表
Status listTraverse(SqList L){
int i;
for(i = 0; i < L.length; i++){
printf("%d ",L.data[i]);
}
printf("\n");
return OK;
}
//主程序
int main(void){
SqList L;
ElemType e;
initList(&L);
int option = 1;
int input_number;
int res;
ElemType input_value;
printf("\n1.遍历线性表 \n2.创建线性表 \n3.清空线性表 \n4.线性表插入 \n5.查找表中元素 \n6.判断元素是否在表中 \n7.删除某个元素 \n8.线性表长度\n9.线性表是否为空\n0.退出 \n请选择你的操作:\n");
while(option){
scanf("%d",&option);
switch(option){
case 0:
return OK;
break;
case 1:
listTraverse(L);
break;
case 2:
createList(&L);
listTraverse(L);
break;
case 3:
clearList(&L);
listTraverse(L);
break;
case 4:
printf("请输入插入的位置:");
scanf("%d",&input_number);
printf("\n");
printf("请输入插入的值:");
scanf("%d",&input_value);
printf("\n");
listInsert(&L, input_number, input_value);
listTraverse(L);
break;
case 5:
printf("请输入要查找的位置:");
scanf("%d",&input_number);
printf("\n");
getElem(L, input_number, &input_value);
printf("第%d个元素的值为:%d\n",input_number,input_value);
break;
case 6:
printf("请输入要查找的元素:");
scanf("%d",&input_value);
printf("\n");
res = locateElem(L, input_value);
if(res != ERROR){
printf("值为%d在表中的第%d个位置\n",input_value,input_number);
}
break;
case 7:
printf("要删除第几个元素?");
scanf("%d",&input_number);
printf("\n");
deleteList(&L, input_number, &input_value);
listTraverse(L);
break;
case 8:
res = getListLength(L);
printf("线性表的长度是:%d",res);
break;
case 9:
res = listEmpty(L);
if(res){
printf("线性表的是空的");
}else{
printf("线性表的是不是空的");
}
break;
}
}
return OK;
}
线性表的特征是:
1. 元素之间是有序的,如果元素存在多个,则第一个元素无前驱,最后一个无后继,其它元素都有且只有一个前驱和后继.
2. 元素个数是有限的. 当n=0是,称为空表
线性表实现方式有两种,分别是顺序存储结构和链式存储结构,它们之间各有优缺点 . 根据需求的不同进行选择不同的存储结构.
线性表存储结构的优缺点
优点:
1. 无须为表中元素之前的逻辑关系而增加额外的存储空间
2. 可以快速的存取表中的任一位置的元素
缺点:
1. 插入和删除操作需要移动大量元素
2. 当线性表长度变化较大时,难以确定存储空间的容量.
3. 造成存储空间的”碎片”.
④ 用C语言建立一个顺序存储的线性表并实现线性表的插入和删除操作
此顺序表实现了多个功能,代码很完善,我将其改成从键盘输入跟选择删除了,你根据你的需要自己再进行修改。
//common.h文件,头文件
#ifndef_COMMON_H_
#define_COMMON_H_
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<assert.h>
#defineTRUE1
#defineFALSE0
#defineMAXSIZE100
typedefintdatatype;
typedefstruct
{
datatypedata[MAXSIZE];
intlength;
}sqnode,*sqlink;
voidcreat_sqlist(sqlink*sq);
voidset_empty_sqlist(sqlinksq);
intisempty_sqlist(sqlinksq);
intisfull_sqlist(sqlinksq);
intgetlength_sqlist(sqlinksq);
datatypegetelem(sqlinksq,inti);//i为第i个元素
intlocate_sqlist(sqlinksq,datatypex);//返回该元素在表中的位置
voidinsert_sqlist(sqlinksq,datatypex,inti);//表示在表中第i个位置前插入。
datatypedel_sqlist(sqlinksq,inti);//删除表中第i个元素
voidshow_sqlist(sqlinksq);
#endif
//线性表实现的c代码
#include"common.h"
voidcreat_sqlist(sqlink*sq)
{
*sq=(sqlink)malloc(sizeof(sqnode));
assert(*sq);
bzero(*sq,sizeof(sqnode));
(*sq)->length=0;
}
voidset_empty_sqlist(sqlinksq)
{
sq->length=0;
}
intisempty_sqlist(sqlinksq)
{
returnsq->length==0?TRUE:FALSE;
}
intisfull_sqlist(sqlinksq)
{
returnsq->length==MAXSIZE?TRUE:FALSE;
}
intgetlength_sqlist(sqlinksq)
{
returnsq->length;
}
datatypegetelem(sqlinksq,inti)//i为第i个元素
{
if(i<1||i>getlength_sqlist(sq))
{
printf("iiswrong! ");
returnFALSE;
}
returnsq->data[i-1];
}
intlocate_sqlist(sqlinksq,datatypex)//返回该元素在表中的位置
{
intj=1;
while(j<=getlength_sqlist(sq))
{
if(sq->data[j-1]==x)
returnj;
j++;
}
returnFALSE;
}
voidinsert_sqlist(sqlinksq,datatypex,inti)//表示在表中第i个位置前插入。
{
intj=1;
if(isfull_sqlist(sq))
{
printf("sqlistisfull! ");
return;
}
if(i<1||i>getlength_sqlist(sq)+1)
{
printf("iisnotintherange! ");
return;
}
for(j=getlength_sqlist(sq)-1;j>=i-1;j--)
{
sq->data[j+1]=sq->data[j];
}
sq->data[i-1]=x;
++sq->length;
}
datatypedel_sqlist(sqlinksq,inti)//删除表中第i个元素
{
datatyperet;
if(isempty_sqlist(sq))
{
printf("sqlistisempty! ");
returnFALSE;
}
if(i<1||i>getlength_sqlist(sq))
{
printf("iisnotintherange!");
returnFALSE;
}
for(i;i<getlength_sqlist(sq);i++)
sq->data[i-1]=sq->data[i];
--sq->length;
returnret;
}
voidshow_sqlist(sqlinksq)
{
intj=0;
for(j;j<getlength_sqlist(sq);j++)
printf("%d,",sq->data[j]);
putchar(' ');
}
//main函数
#include"common.h"
intmain(intargc,char*argv[])
{
inti=0,n,id;
intnum;
printf("你要往顺序表中插入几个元素 ");
scanf("%d",&num);
printf("请往顺序表中插入%d个元素: ",num);
sqlinksq=NULL;
creat_sqlist(&sq);
while(i<num)
{
scanf("%d",&n);
insert_sqlist(sq,n,1);
i++;
}
printf("顺序表的存储如下: ");
show_sqlist(sq);
printf("你要删除第几个元素? ");
scanf("%d",&id);
del_sqlist(sq,id);
printf("删除第%d个元素之后的顺序表为: ",id);
show_sqlist(sq);
return0;
}
⑤ 用c语言建立一个顺序存储的线性表,实现线性表的插入、删除操作
链表
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<stdio.h>
#include<stdlib.h>
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);//删除链表结点
}
⑥ 利用c语言实现顺序存储线性表的插入!
有时会出现这种情况。他会以为是木马。
int GetElem();
int InstInsert();
typedef int ElemType;
typedef struct{
ElemType *elem; //存储空间基地址
int length; //当前长度
int listsize;//当前分配的存储容量
}SqList;
int InitList(SqList *L){
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(-1);//存储空间分配失败
L->length=0; //空表长度为0
L->listsize=LIST_INIT_SIZE; //初始存储容量
printf("线性链表创建成功\n");
return OK;
}
int Input(SqList *L){
ElemType temp,*newbase;
printf("输入顺序列表的数据,以0为结束标志\n");
scanf("%d",&temp);
while(temp!=0){
if(L->length>=L->listsize){
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!newbase) exit(-1);//存储空间分配失败
L->elem=newbase; //空间新基地址
L->listsize+=LISTINCREMENT; //增加存储容量
}
L->elem[L->length++]=temp;
scanf("%d",&temp);
}
printf("输入数据结束!!\n");
return OK;
}
int Onput(SqList *L){
int i=0;
printf("输出线性表数据:");
while(i<L->length){
printf("%d\t",L->elem[i]);
i++;
}
printf("\n");
}
int ClearList(SqList *L){
L->length=0;
printf("清除成功!\n");
return OK;
}
void ListEmpty(SqList L){
if(L.elem!=NULL)
printf("true!\n");
else
printf("false!\n");
}
void ListLength(SqList L){
printf("线性表的长度是:%d\n",L.length);
return ;
}
int GetElem(SqList L,int i,SqList *e){
e=L.elem[i-1];
return e;
}
void PriorElem(SqList L,int cur_e,SqList *pre_e){
if(cur_e!=L.elem[0]){
pre_e=L.elem[0];
printf("前驱值为:%d\n",pre_e);
}
else
printf("pre_e无意义\n");
}
void NextElem(SqList L,int cur_e,SqList *next_e){
if(cur_e!=L.elem[L.length-1]){
next_e=L.elem[L.length-1];
printf("后继值为:%d\n",next_e);
}
else
printf("next_e无意义\n");
}
int ListInsert(SqList *L,int i,int e){
ElemType *newbase,*p,*q;
if(1>i||i>(L->length+1))
return -1;
if(L->length>=L->listsize){ //新增内存
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //开辟新内存空间
if(!newbase)
exit(-1); //存储分配失败
L->elem=newbase; //新基地址
L->listsize+=LISTINCREMENT; //新增内存容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
++L->length;
return OK;
}
int ListDelete(SqList *L,int i,int e){
ElemType *p,*q;
if(i<1||i>L->length)
return -1;
q=&(L->elem[i-1]);
e=L->elem[i-1];
p=L->elem+L->length-1;
for(;p>=q;q++)
*q=*(q+1);
--L->length;
printf("删除的值为:%d\n",e);
return OK;
}
⑦ 用C语言的一维数组实现线性表的顺序存储
还是说只要是在内存中申请了一块连续的地址空间存储数据只要知道其首地址都可以用数组的形式访问其中的元素呢?
就是这样的。
线性表的特点就是长度可变,如果使用常规的数组,就不能实现这个特性,因为数组是定长的。而在堆中申请的内存可以通过参数在运行时指定它的大小,且可以调整它的大小,并且其使用方式和数组一样,使用索引访问。
int*p = (int*)malloc(sizeof(int)*5);
p[0]; //第一个元素
p[1]; //第二个元素
p[2]; //第三个元素
//...
free(p);
⑧ 利用线性表的顺序存储结构完成一个班级的所有课程的管理c语言要求实现增加,删除,修改学生成绩记录等功
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data; //链表数据
struct LNode* next; //链表指针
}LNode,*LinkList;
/*头插法-建立单链表*/
LinkList HeadCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode)); //建立头结点
la->next=NULL;
scanf("%d",&num);
while(num!=10)
{
LNode *p=(LinkList)malloc(sizeof(LNode));
p->data=num;
p->next=la->next;
la->next=p;
scanf("%d",&num);
}
return la;
}
/*尾插法-建立单链表*/
LinkList TailCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
LinkList s,r=la;
scanf("%d",&num);
while(num!=10)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=num;
r->next=s;
r=s;
scanf("%d",num);
}
r->next=NULL;
return la;
}
/*单链表遍历*/
void TravelList(LinkList la)
{
LinkList p=la->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("\n");
}
/*单链表的按位查找*/
LinkList GetElem(LinkList la,int i)
{
int j=1;
LNode* p=la->next;
if(i<1)
return NULL;
while(p && j<i)
{
p=p->next;
j++;
}
return p;
}
/*单链表的按值查找*/
LinkList LocalElem(LinkList la,int e)
{
LNode* p=la->next;
while(p!=NULL && p->data!=e)
p=p->next;
return p;
}
/*单链表插入操作*/
bool InsertList(LinkList la,int i,int e)
{
//在la链表中的i位置插入数值e
int j=1;
LinkList p=la,s;
while(p && j<i)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if((s=(LinkList)malloc(sizeof(LNode)))==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
/*单链表删除操作*/
bool DeleteList(LinkList la,int i)
{
int j=1;
LinkList p=la,q;
while(p && j<i) //p指向第i-1个元素
{
p=p->next;
j++;
}
if(p==NULL || p->next==NULL) //表示不存在第i-1个和第i的元素
return false;
q=p->next;
p->next=q->next;
free(q);
return true;
}
/*单链表的表长*/
int LengthList(LinkList la)
{
int nLen=0;
LinkList p=la->next;
while(p)
{
p=p->next;
nLen++;
}
return nLen;
}
/*单链表逆置*/
LinkList Reserve(LinkList la)
{
if(la==NULL || la->next==NULL)
return la;
LinkList p=la->next,q=p->next,r=q->next;
la->next=NULL;
p->next=NULL;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
la->next=q;
return la;
}
int main()
{
LNode la;
LinkList p;
p=HeadCreate(&la); //头插法创建单链表
TravelList(p);
printf("%p\n",GetElem(p,1)); //获得第1个结点地址
InsertList(p,2,10); //在链表的第2个位置插入元素10
TravelList(p);
DeleteList(p,3); //删除链表的第3个元素
TravelList(p);
printf("%d\n",LengthList(p)); //获得链表长度
p=Reserve(p);
TravelList(p);
return 0;
}
//运行结果
//5 6 12 7 8 14 9 3 2 5 14 10 头插法创建链表
//14->5->2->3->9->14->8->7->12->6->5-> 显示链表
//00382490 第一个结点的地址
//14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值为10的结点
//14->10->2->3->9->14->8->7->12->6->5-> 删除第三个结点
//11 获得链表长度
//5->6->12->7->8->14->9->3->2->10->14-> 链表逆置
//Press any key to continue
这是我写的一个线性表链式存储的综合程序,包含了你所要的创建、删除、插入、按值查找的功能,还有一些额外的功能。下面加注释的是程序运行结果,你可以参考试着改改程序,让程序更加完美。希望对你有帮助,呵呵!
⑨ C语言线性表顺序存储
建链表的函数用引用就好了
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
//-------------------
#defineMAXSIZE100//Thelargestnumberofpeople
typedefintElemType;
typedefstruct
{
ElemTypedata[MAXSIZE];
ElemTypepassward[MAXSIZE];
intlength;
}seqList;
seqList*L;
voidCreaList(seqList*&L,int[MAXSIZE],intn);/////引用
voidPrintList(seqList*L,intn);//不一致
intmain(void)
{
intn=0,m=0;
inta[MAXSIZE];
do
{
if(n>MAXSIZE)
{
printf("Thenumberofpeopletoomuch,pleaseinputagain! ");
}
printf("Pleaseenterthenumberofpeople(upto%d):",MAXSIZE);
scanf_s("%d",&n);
}while(n>MAXSIZE);
printf("Pleaseentertheinitailpassword:");
scanf_s("%d",&m);
CreaList(L,a,n);
printf("--------printthelineartable-------- ");
PrintList(L,n);
printf("初始化成功... ");
system("pause");
}
voidCreaList(seqList*&L,inta[MAXSIZE],intn)/////引用
{
intiPassword;
L=(seqList*)malloc(sizeof(seqList));
for(inti=1;i<=n;i++)
{
L->data[i]=a[i];
printf("Pleaseenterthe%dpersonalpassword:",i);
scanf_s("%d",&iPassword);
L->passward[i]=iPassword;
}
L->length=n;
}
voidPrintList(seqList*L,intn)
{
for(inti=1;i<=n;i++)
{
printf("--------ID---------PASSWORD-------- ");
printf("%6d%5d ",L->data[i],L->passward[i]);
}
}