永发信息网

谁给个最简单的线性表建立程序

答案: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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯