谁给个最简单的线性表建立程序
答案:4 悬赏:70 手机版
解决时间 2021-02-02 22:47
- 提问者网友:饥饿走向夜
- 2021-02-02 09:49
谢谢了
最佳答案
- 五星知识达人网友:荒野風
- 2021-02-02 10:30
线性表有两种存储结构--------顺序和链式。
每种都有其建立程序,分别实现。
1)顺序结构
线性表用一维数组实现,比较容易。假设a为存放整型数的数组,参数传递为数组的首地址:
creat_s(int *a,int n)//n为线性表的个数,MAX代表是数组的上限
{int i;
for (i=0;i {if(i>MAX)
{printf("error");break;}
scanf("%d",a+i);
}
}
2)链式结构
下面是建立带头结点的单链表,head为头结点
creat_L(link *head,int n)
{
link *p; int i;
head=(link*)malloc(sizeof(link));
p=head;
for (i=0;i {p->next=(link*)malloc(sizeof(link));
p=p->next;
scanf("%d",p->data);
}
p->next=NULL;
}
全部回答
- 1楼网友:大漠
- 2021-02-02 12:37
百度
- 2楼网友:春色三分
- 2021-02-02 12:09
#include // malloc()等
#include // eof(=^z或f6),null
#include // floor(),ceil(),abs()
#include // exit()
// 函数结果状态代码
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
typedef int status; // status是函数的类型,其值是函数结果状态代码,如ok等
typedef int elemtype;
#define list_init_size 10 // 线性表存储空间的初始分配量
#define listincrement 2 // 线性表存储空间的分配增量
线中间就是线性表的定义和函数。
————————————————————————————————————
struct sqlist
{
elemtype *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(elemtype)为单位)
};
status initlist(sqlist &l) // 算法2.3
{ // 操作结果:构造一个空的顺序线性表
l.elem = (elemtype*)malloc(list_init_size*sizeof(elemtype));
if (!l.elem)
exit(overflow); // 存储分配失败
l.length = 0; // 空表长度为0
l.listsize = list_init_size; // 初始存储容量
return ok;
}
status destroylist(sqlist &l)
{ // 初始条件:顺序线性表l已存在。操作结果:销毁顺序线性表l
free(l.elem);
l.elem = null;
l.length = 0;
l.listsize = 0;
return ok;
}
status clearlist(sqlist &l)
{ // 初始条件:顺序线性表l已存在。操作结果:将l重置为空表
l.length = 0;
return ok;
}
status listempty(sqlist l)
{ // 初始条件:顺序线性表l已存在。操作结果:若l为空表,则返回true,否则返回false
if (l.length == 0)
return true;
else
return false;
}
int listlength(sqlist l)
{ // 初始条件:顺序线性表l已存在。操作结果:返回l中数据元素个数
return l.length;
}
status getelem(sqlist l, int i, elemtype &e)
{ // 初始条件:顺序线性表l已存在,1≤i≤listlength(l)
// 操作结果:用e返回l中第i个数据元素的值
if (i<1 || i>l.length)
exit(error);
e = *(l.elem + i - 1);
return ok;
}
int locateelem(sqlist l, elemtype e, status(*compare)(elemtype, elemtype))
{ // 初始条件:顺序线性表l已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回l中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。算法2.6
elemtype *p;
int i = 1; // i的初值为第1个元素的位序
p = l.elem; // p的初值为第1个元素的存储位置
while (i <= l.length&&!compare(*p++, e))
++i;
if (i <= l.length)
return i;
else
return 0;
}
status priorelem(sqlist l, elemtype cur_e, elemtype &pre_e)
{ // 初始条件:顺序线性表l已存在
// 操作结果:若cur_e是l的数据元素,且不是第一个,则用pre_e返回它的前驱,
// 否则操作失败,pre_e无定义
int i = 2;
elemtype *p = l.elem + 1;
while (i <= l.length&&*p != cur_e)
{
p++;
i++;
}
if (i>l.length)
return infeasible;
else
{
pre_e = *--p;
return ok;
}
}
status nextelem(sqlist l, elemtype cur_e, elemtype &next_e)
{ // 初始条件:顺序线性表l已存在
// 操作结果:若cur_e是l的数据元素,且不是最后一个,则用next_e返回它的后继,
// 否则操作失败,next_e无定义
int i = 1;
elemtype *p = l.elem;
while (il.length + 1) // i值不合法
return error;
if (l.length >= l.listsize) // 当前存储空间已满,增加分配
{
if (!(newbase = (elemtype *)realloc(l.elem, (l.listsize + listincrement)*sizeof(elemtype))))
exit(overflow); // 存储分配失败
l.elem = newbase; // 新基址
l.listsize += listincrement; // 增加存储容量
}
q = l.elem + i - 1; // q为插入位置
for (p = l.elem + l.length - 1; p >= q; --p) // 插入位置及之后的元素右移
*(p + 1) = *p;
*q = e; // 插入e
++l.length; // 表长增1
return ok;
}
status listdelete(sqlist &l, int i, elemtype &e) // 算法2.5
{ // 初始条件:顺序线性表l已存在,1≤i≤listlength(l)
// 操作结果:删除l的第i个数据元素,并用e返回其值,l的长度减1
elemtype *p, *q;
if (i<1 || i>l.length) // i值不合法
return error;
p = l.elem + i - 1; // p为被删除元素的位置
e = *p; // 被删除元素的值赋给e
q = l.elem + l.length - 1; // 表尾元素的位置
for (++p; p <= q; ++p) // 被删除元素之后的元素左移
*(p - 1) = *p;
l.length--; // 表长减1
return ok;
}
status listtraverse(sqlist l, void(*vi)(elemtype&))
{ // 初始条件:顺序线性表l已存在
// 操作结果:依次对l的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
// vi()的形参加'&',表明可通过调用vi()改变元素的值
elemtype *p;
int i;
p = l.elem;
for (i = 1; i <= l.length; i++)
vi(*p++);
printf("\n");
return ok;
}
————————————————————————————————————
void print(elemtype &c)
{
printf("%d ", c);
}
void main()
{
sqlist la;
int j;
initlist(la);
for (j = 1; j <= 5; j++) // 在表la中插入5个元素
listinsert(la, j, j);
printf("la= "); // 输出表la的内容
listtraverse(la, print);
}
- 3楼网友:孤老序
- 2021-02-02 11:26
这是我以前写的作业,比你这个题的要求还要多,肯定能满足你的要求。
#include"stdio.h"
#include
typedef char ElemType;
typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表
{
LinkList *s,*r;int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i {
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void InitList(LinkList *&L) //初始化线性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void DispList(LinkList *L) //输出线性表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}
void CombList(LinkList *L1,LinkList *L2,LinkList *&k) //两个集合的交
{
LinkList *p=L1->next ,*q=L2->next ,*b,*a,*c;
k=(LinkList *)malloc(sizeof(LinkList));
b=k;a=p;
while(q!=NULL)
{
while(a!=NULL)
{
if(a->data==q->data)
{
c=(LinkList *)malloc(sizeof(LinkList));
c->data=a->data;b->next=c;b=b->next;
}
a=a->next;
}
q=q->next;
a=p;
}
b->next=NULL;
}
void AddList(LinkList *L1,LinkList *L2,LinkList *&k) //两个集合的并
{
LinkList *p=L1->next ,*q=L2->next ,*b,*a,*c;
k=(LinkList *)malloc(sizeof(LinkList));
b=k;a=p;
while(q!=NULL)
{
int x=0;
while(p!=NULL)
{
if(p->data==q->data)x++;
p=p->next;
}
if(!x)
{
c=(LinkList *)malloc(sizeof(LinkList));
c->data=q->data;b->next=c;b=b->next;
}
q=q->next;
p=a;
}
b->next=a;
}
void RankList(LinkList *&L) //按从小到大排列
{
LinkList *p=L->next,*q,*r;
if (p!=NULL)
{ r=p->next;
p->next=NULL;
p=r;
while (p!=NULL)
{ r=p->next;
q=L;
while (q->next!=NULL && q->next->datadata)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}
int main()
{
ElemType a[5]=,b[4]=;
LinkList *h1,*h2,*p1,*p2;
InitList(h1); //初始化顺序表h
InitList(h2);
CreateListR(h1,&a[0],5); //依次采用尾插入法插入a,b,c,d,e元素
CreateListR(h2,&b[0],4);
printf("单链表1为:");
DispList(h1); printf("\n"); //输出顺序表h
printf("单链表2为:");
DispList(h2); printf("\n");
CombList(h1,h2,p1); //求两个单链表的交
printf("这两个单链表的交为:");
DispList(p1); printf("\n");
AddList(h1,h2,p2); //求两个单链表的并
printf("这两个单链表的并为:");
DispList(p2); printf("\n");
RankList(p2); //对单链表按从小到大排列
printf("这个单链表排列后为:");
DispList(p2); printf("\n");
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯