利用c语言线性表实现顺序存储线性表的插入!

用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
骋我径寸翰,流藻垂华芳
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
◆2.11② 设顺序表L中的数据元素递增有序。试写一算法,将x插入到L的适当位置上,并保持该表的有序性。
要求实现下列函数:void InsertOrderList(SqList &L, ElemType x)/* 在有序的顺序表 L 中保序插入数据元素 x */
顺序表类型定义如下:typedef struct {&&& ElemType *&&& int&&&&&&&&& int&&&&&&} SqL
void InsertOrderList(SqList &L, ElemType x)// 在有序的顺序表 L 中保序插入数据元素 x{&& int i=0,j;&&&&& && if(x&=L.elem[L.length-1]) L.elem[L.length]=x;//如果x大于表最后一个元素
,则直接插到最后面&& else{&& while(L.elem[i]&=x) i++;&&&&&&&&&&& //找到x的插入位置&&&&&&&&&& for(j=L.length-1;j&=i;j--)& L.elem[j+1]=L.elem[j] ;&&&&&&&&&& L.elem[i]=x;&&&&&& }&& L.length++;&&&&&&&&&&&&&&&& //表长加1
◆2.12③ 设A=(a1,…,am)和B=(b1,…,bn)均为有序顺序表,A'和B'分别为A和B中除去最大共同前缀后的子表(例如,A=(x,y,y,z,x,z),B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为(x,y,y,z), 在两表中除去最大共同前缀后的子表分别为A'=(x,z)和B'=(y,x,x,z))。若A'=B'=空表,则A=B;若A'=空表,而B'≠ 空表,或者两者均不为空表,且A'的首元小于B'的首元,则A&B;否则A&B。试写一个比较A和B大小的算法。(注意:在算法中,不要破坏原表A和B,也不一定先求得A'和B'才进行比较)。
要求实现下列函数:char Compare(SqList A, SqList B);/* 比较顺序表A和B,&&&&& *//*&& 返回'&', 若A&B;&&& *//*&&&&&& '=', 若A=B;&&& *//*&&&&&& '&', 若A&B&&&& */
顺序表类型定义如下:typedef struct {&&& ElemType *&&& int&&&&&&&&& int&&&&&&} SqL
char Compare(SqList A, SqList B){& int pa=A.length,pb=B.length,i=1,j=1;&& if(A.elem[0]&B.elem[0]) return '&';& //直接先由第一个元素判断谁大&& if(A.elem[0]&B.elem[0]) return '&';&& else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //如果第一个元素相同,则分以下情况&&&&& { if(pa==pb)&&&&&&&& { while(i&=pa-1&&j&=pb-1)&&&&&&&&&& { if(A.elem[i]&B.elem[j]) return '&';& //相对应的元素逐个比较&&&&&&&&&&&& if(A.elem[i]&B.elem[j]) return '&';&&&&&&&&&&&& if(A.elem[i]==B.elem[j]) {i++;j++;}& //直到末尾都相等,则输出“=”&&&&&&&&&&& } &&&&&&&&& return '=';&&&&&&&& }&&&&&&&& &&&&&&&& if(pa&pb)&&&&&&&& {& while(i&=pa-1&&j&=pb-1)&&&&&&&&&& { if(A.elem[i]&B.elem[j]) return '&';&&&&&&&&&&&& if(A.elem[i]&B.elem[j]) return '&';&&&&&&&&&&&& if(A.elem[i]==B.elem[j]) {i++;j++;}&&& //元素依然相同,i达到A表表长的限制,跳出&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //则 B表大于A表&&&&&&&&& return '&';&&&&&&&& }&&&&&&&& &&&&&&&& if(pa&pb)&&&&&&&& {&& while(i&=pa-1&&j&=pb-1)&&&&&&&&&& { if(A.elem[i]&B.elem[j]) return '&';&&&&&&&&&&&& if(A.elem[i]&B.elem[j]) return '&';&&&&&&&&&&&& if(A.elem[i]==B.elem[j]) {i++;j++;}& //元素依然相同,i达到A表表长的限制,跳出&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //则 B表小于A表&&&&&&&&& return '&';&&&&&&&& }&&&&& } &&&&&&&&&&&& }
2.13② 试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x)。
实现下列函数:LinkList Locate(LinkList L, ElemType x);// If 'x' in the linked list whose head node is pointed // by 'L',& then return pointer pointing node 'x', // otherwise return 'NULL'
单链表类型定义如下:typedef struct LNode {&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
LinkList Locate(LinkList &L, ElemType x)//& If 'x' in the linked list whose head node is pointed//& by 'L', then return pointer ha pointing node 'x',//& otherwise return 'NULL'{&&& LinkL&&&& p=L-&&&&& while(p)&&&&& {& if(p-&data==x)&&& //找到x则输出&&&&&&&& else p=p-&&&&&&&&&&&&& //找不到则指针指向下一位&&&&& }&&&&& return NULL;&&&&&&&&&&&&&&&&& //表里没有x&&&&&&&&&&&&&&&& }
2.14② 试写一算法在带头结点的单链表结构上实现线性表操作Length(L)。
实现下列函数:int Length(LinkList L);// Return the length of the linked list // whose head node is pointed by 'L'
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
int Length(LinkList L)// Return the length of the linked list // whose head node is pointed by 'L'{& int j=0;&& LinkList P;&& P=L-&&& while(P!=NULL)&& {& P=P-&&&&&& j++;&& }&& &&
2.16③& 已知指针la和lb分别指向两个无头结点单链表中的首元结点。 下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第i个元素之前。试问此算法是否正确? 若有错,则请改正之。
实现下列函数:Status DeleteAndInsertSub(LinkList &la, LinkList &lb,&&&&&&&&&&&&&&&&&&&&&&&&& int i, int j, int len);// la和lb分别指向两个单链表中第一个结点,&&&&&&& *//* 本算法是从la表中删去自第i个元素起共len个元素,*//* 并将它们插入到lb表中第j个元素之前,&&&&&&&&&& *//* 若lb表中只有j-1个元素,则插在表尾。&&&&&&&&&& */
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
Status DeleteAndInsertSub(LinkList &la, LinkList &lb,&int i, int j, int len){& LinkList p,s,q,w;&& p=s=w=NULL;&& int a=1,b=1,c=1;&& if(i&=0||j&=0||len&=0)& return INFEASIBLE;&& while(p&&a&i)&& { w=p;p=p-&a++;}&&&&&&&&&&& //建立一个w的空链表来存放la的数据&& if(!p) return INFEASIBLE;&& && q=p;&& while(q&&b&len)&& { q=q-& b++;}&& if(!q) return INFEASIBLE;&& if(!w) la=q-&&&&&& //i=1的情况,删除len个元素后,将len+1号元素移到第一个结点存放,其他元素向前移&& else w-&next=q-&& //将删除了len个元素后的其他元素跟前面链接起来&& if(j==1)&& { q-&next=lb=p;}&& else&& {& while(s&&c&j-1)&&&&&&&&&&&& //如果只有j-1位,插在表后,如果有j位,插在j-1位后就是插在j位前。&&&&& {s=s-&c++;}&&&&& if(!s) return INFEASIBLE;&&&&& q-&next=s-&&&&&& s-&next=p;&&&&& && } && return OK;}
◆2.19③& 已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)。
实现下列函数:void DeleteSome(LinkList &L, ElemType mink, ElemType maxk);/* Delete all the elements which value is between mink and& *//* maxk from the single sorted LinkList with head pointer L.*/
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void DeleteSome(LinkList &L, ElemType mink, ElemType maxk){&& LinkList p,q,w;&&& p=L-&&&& w=NULL;&&& while(p-&data&=mink)& //先将第一个结点的数据跟mink比较,&&& {w=p;&&&& p=p-&&&&&&&&&&& //如果小于mink,则指向下一个结点&&&& if(!p)&&&&&&&& //如果大于mink,跳出&&& }&&& &&& while(p-&data&maxk)&& //将跳出的p所指向的数据跟maxk比较 &&& {q=p;&&&&&&&&&&&&&&&&& //如果大于,则跳出&&&& p=q-&&&&&&&&&&&& //如果小于则将在有效范围内的数据删除并释放结点空间&&&& free(q);&&&& if(!p)&&& }&&&& w-&next=p;&&&&&&&&&& //将删除后的前后两段重新链接}
2.20②& 同2.19题条件,试写一高效的算法,删除表中所有值相同的多余元素 (使得操作后的线性表中所有元素的值均不相同) 同时释放被删结点空间,并分析你的算法的时间复杂度。
实现下列函数:void Purge(LinkList &L);
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void Purge(LinkList &L){& LinkList p,q,w;&& p=L-&&& q=p;&&&&&&&&&&&&&&&&&&&&&&&& //将q指向第一个结点&& p=p-&&&&&&&&&&&&&&&&&& //将p指向第二个结点&& while(p)&&&&&&&&&&&&&&&&&& //如果p不为空&& { if(q-&data==p-&data)&&&&& //q的元素与p的元素比较,如果相等&&&&& { w=p-&&&&&&&&&&&&& //用w保存p下一位的节点的地址&&&&&&& q-&next=w;&&&&&&&&&&&& //将该结点地址保存到q的指针域&&&&&&& free(p);&&&&&&&&&&&&&&& //释放p&&&&&&& p=w;&&&&&&&&&&&&&&&&&&& //将p移到下一个结点&&&&&&& if(!p)&&&&&&&&&& //如果p为空了,跳出,不为空,重新循环&&&&&& }&&&&& else{q=p;&&&&&&&&&&&&&&&&& //q和p的元素不相等&&&&&&&&&&&&& p=p-&&&&&&&&&&&& //则同时将q和p指向下一位,然后重新循环判断&&&&&&&&&&&& &if(!p)&&&&&&&&&&&& &}& }&&&&& }
◆2.21③ 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,an)逆置为(an,an-1,…,a1)。
实现下列函数:void Inverse(SqList &L);
顺序表类型定义如下:typedef struct {&&& ElemType *&&& int&&&&&&&&& int&&&&&&} SqL
void Inverse(SqList &L){ int p,n=0,pa=L.length-1;& while( n&=pa/2)& {p= L.elem[n];&& L.elem[n]= L.elem[pa-n];&& L.elem[pa-n]=p;&& n++;& }}
◆2.22③& 试写一算法,对单链表实现就地逆置。
实现下列函数:void Inverse(LinkList &L); /* 对带头结点的单链表L实现就地逆置 */
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void Inverse(LinkList &L) {& LinkList p,q;&& && p=L-&&& L-&next=NULL;&&& //将头结点与第一个结点断开,设为空&& while(p)&&&&&&&&& //从第一个元素起,将后面的数依次插入到表的头部 ,成为新的第一个元素&& { q=p-&&&&& p-&next=L-&&&&& L-&next=p;&&&& p=q;&&&& }
2.23③ 设线性表A=(a1,...,am), B=(b1,...,bn),试写一个按下列规则合并A、B为线性表C的算法,即使得&&&&& C=(a1,b1,...,am,bm,bm+1,...,bn)& 当m≤n时;或者& C=(a1,b1,...,an,bn,an+1,...,am)& 当m>n时。线性表A、B和C均以单链表作存储结构,且C表利用A表和B表中的结点空间构成。注意:单链表的长度值m和n均未显式存储。
实现下列函数:void Merge(LinkList ha, LinkList hb, LinkList &hc)/* 依题意,合并带头结点的单链表ha和hb为hc& */
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void Merge(LinkList ha, LinkList hb, LinkList &hc){& LinkList p,q,s,t;& p=ha-&&&&&&&&&&&&&&&&&& //p为a表第一个结点& q=hb-&&&&&&&&&&&&&&&&&&& //q为b表第一个结点& hc=&&&&&&&&&&&&&&&&&&&&&& //用用a表的头结点做c表表头结点& s=hc-&& if(!p) hc=&&&&&&&& //如果p空,c表即为b表& if(!q) hc=&&&&&&&& //如果q空,c表即为a表& while(p&&q)&& {&&&&&&&&&&&&&&&&&&&&&&& //将a,b表中的元素间隔插入c表&&&&& s=p-&&&&&& p-&next=q;&&&&& if(s)&&&&&&&&&&&&& //如果s非空,即a表元素未完&&&&& {t=q-&&&&&&& q-&next=s;&&&&& }&&&&& p=s;q=t;&& } && free(hb);&&&&&&&&&&&&& //释放b表头结点}
2.26④& 假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合(即同一表中的元素值各不相同),现要求另辟空间构成一个线性表C,其元素为A和B中元素的交集,且表C中的元素也依值递增有序排列。试对单链表编写求C的算法。
实现下列函数:void Intersect(LinkList &hc, LinkList ha, LinkList hb);
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void Intersect(LinkList &hc, LinkList ha, LinkList hb){& LinkList p,q,w;&& p=ha-&&&&&&&&&&&&&&&&&&&&&&&&&&&& //p为A表第一个结点&& q=hb-&&&&&&&&&&&&&&&&&&&&&&&&&&&& //q为B表第一个结点&& hc=(LinkList)malloc(sizeof(LNode));&& hc-&next=NULL;&&&&&&&&&&&&&&&&&&&&&&& //建立一个带头结点的单链表C&& w=&& while(p&&q)&&&&&&&&&&&&& //p,q非空&& {if(p-&data==q-&data)&&&&&&&&&&&& //如果两表第一位的数据相同 ;或是循环中相同&&&& {w-&next=(LinkList)malloc(sizeof(LNode));& //在c表中生成新的结点&&&&& w=w-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //移到下一个结点&&&&& w-&data=p-&da&&&&&&&&&&&&&&&&&&&&&&&& //将相同的数据存入c表&&&&& p=p-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //p指向下一个结点&&&&& q=q-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //q指向下一个结点&& }&&& if(p-&data&q-&data)& q=q-&&& //如果不同,且A表第一位大于B表第一位,则B表&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &//中q指向下一个结点 ,然后循环&&& if(p-&data&q-&data)& p=p-&&& //同上&& }}
2.31②& 假设某个单向循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表中某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。
实现下列函数:ElemType DeleteNode(LinkList s); /* 删除指针s所指结点的前驱结点,并返回被删结点的元素值 */
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
ElemType DeleteNode(LinkList s) {&& LinkList p,w;& ElemT&&& w=s;&&&&&&&&&&&&&&&& //将s赋给w ,此时是s所指向的结点&&& w=w-&&&&&&&&&&& //w指向下个结点&&& if(w-&next==s)&&&&&& //如果w的指针域里存的是s的地址,也就是该表只有两个结点&&& {s-&next=s;&&&&&&&&& //则在原来s的指针域里存上自己的地址&&&& e=w-&da&&&&&&&&& //取出第二个节点的元素&&&& free(w);&&&&&&&&&&& //释放该节点&&&& }&&& else&&&&&&&&&&&&&&&&& //该表的结点数大于二&&& {while(w-&next!=s)&&& //如果w的指针域里存的不是s的地址&&&& { p=w;&&&&&&&&&&&&&& //用p保留这一个结点&&&&&& w=w-&&&&&&&&& //w指向下一个结点,直到满足跳出&&&& }&&&& p-&next=s;&&&&&&&&&&& //跳出后,也就是w的下一个结点是s所指向的,则把s的地址存入w的上一个结点&&&& e=w-&da&&&&&&&&&&& //取出w的元素&&&& free(w);&&&&&&&&&&&&&&&& //释放结点&&&&&&&&&&&&&&&&& //返回删除点的值&&& }
2.32②& 已知有一个单向循环链表,其每个结点中含三个域:prev、data和next,其中data为数据域,next为指向后继结点的指针域,prev也为指针域,但它的值为空(NULL),试编写算法将此单向循环链表改为双向循环链表,即使prev成为指向前驱结点的指针域。
实现下列函数:void PerfectBiLink(BiLinkList &CL);
双向循环链表类型定义如下:typedef struct BiNode {&&& ElemType&&&&&& da&&& int&&&&&&&&&&& // 2.38题用&&& struct BiNode *prev,&&&&&&&&&&&&&&&&& *} BiNode, *BiLinkL
void PerfectBiLink(BiLinkList &CL){ BiLinkList p,w,s;& p=s=CL-&&&&& //其中s是记住开始时的那个结点& while(p-&next!=s)&&&& //只要p的下一位不是s,则可以继续循环& {w=p;&&&&&&&&&&&&&&&&&& //用w记录p当前位&& p=p-&&&&&&&&&&&&& //p指向下一位&& p-&prev=w;&&&&&&&&&&&& //将p的 前指针域存上上个结点的地址&& }&& s-&prev=p;&&&&&&&&&&&& //直到p的下一位是s,则将s的前指针域存上此时p的地址}
◆2.33③& 已知由一个线性链表表示的线性表中含有三类字符的数据元素(如:字母字符、数字字符和其它字符),试编写算法将该线性链表分割为三个循环链表,其中每个循环链表表示的线性表中均只含一类字符。
实现下列函数:void Split(LinkList &lc, LinkList &ld, LinkList &lo, LinkList ll);
单链表类型定义如下:typedef struct LNode{&&& ElemType&&&&& da&&& struct LNode *} LNode, *LinkL
void Split(LinkList &lc, LinkList &ld, LinkList &lo, LinkList ll){&&& &&& LinkList p,q,w,s,f,a,b,c;&&& p=ll-&&&& lc=(LinkList)malloc(sizeof(LNode));&&&&&&& //置空三个表&&& ld=(LinkList)malloc(sizeof(LNode));&&& lo=(LinkList)malloc(sizeof(LNode));&&& q=& a=q-&&&&&&&&&&& //标记第一个结点&&& w=& b=w-&&&&&&&&&&& //标记第一个结点&&& f=& c=f-&&&&&&&&&&& //标记第一个结点&&& while(p)&&&&&& //线性链表未走完&&& { if(('A'&=p-&data&&p-&data&='Z')||('a'&=p-&data&&p-&data&='z'))& //如果是字母字符&&&&&& { s=(LinkList)malloc(sizeof(LNode));&&& //申请新的结点,下同&&&&&&&& q-&next=s;&&&&&&&& s-&data=p-&da&&&&&&&& s-&next=a;&&&&&&&&&&&&&&&&&&& //最后结点指向头结点,形成循环链表&&&&&&&& q=q-&&&&&&&&& p=p-&&&&&&& }&&&&&& else if('0'&=p-&data&&p-&data&='9')&& //如果是数字字符&&&&&& {& s=(LinkList)malloc(sizeof(LNode));&&&&&&&&& w-&next=s;&&&&&&&&& s-&next=b;&&&&&&&&&&&&&&&&&&&& //最后结点指向头结点,形成循环链表&&&&&&&&& s-&data=p-&da&&&&&&&&& w=w-&&&&&&&&&& p=p-&&&&&&& }&&&&&& else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //其他字符&&&&&& { s=(LinkList)malloc(sizeof(LNode));&&&&&&&& f-&next=s;&&&&&&&& s-&data=p-&da&&&&&&&& s-&next=c;&&&&&&&&&&&&& //最后结点指向头结点,形成循环链表&&&&&&&& f=f-&&&&&&&&& p=p-&&&&&&& }&&& }&&&&&&&& }
&2.37④ &设以带头结点的双向循环链表表示的线性表L=(a1,a2,...,an)。试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3,...,an,...,a4,a2)。实现下列函数:void ReverseEven(BiLinkList &L);双向循环链表类型定义如下:typedef struct BiNode {&& &ElemType & & & da&& &int & & & & & & // 2.38题用&& &struct BiNode *prev,&& & & & & & & & &*} BiNode, *BiLinkL&&void ReverseEven(BiLinkList &L){ BiLinkList p,q,r,s;&&p=L-& & & //p为第一个结点&&s=p-& & & //s为第二个结点&&q=s-& & & //q为第三个结点&&r=L-& & & //r为最后一个结点&&if(s==L||q==L) L=L; & &//如果表中只有一个或两个结点,则表不变&&else&&{ &if(q==r) & & &//表中有三个结点&& & &{p-&next=q; & &//第一个指向第三个&& & & q-&next=s; & &//第三个指向第二个&& & & s-&next=L; & &//第二个指向头结点&& & & q-&prev=p; & &//q的前驱结点是p&& & & L-&prev=s; & & //L的前驱结点是s&& & & s-&prev=q; & & //s的前驱结点是q&& & &}&& & else & & & & & & & & & //表中三个结点以上&& & {&& & & while(s!=r&&p!=r)&& & & {p-&next=q;&& & & &q-&prev=p; & & & &&& & & &p=q; & & & & & &//将p移向下一个结点&&& & & &q=p-&next-&&& & & &s-&next=r-&&& & & &r-&next-&prev=s;&& & & &r-&next=s; & & &//将第二个结点变成最后一个节点&& & & &s-&prev=r; & & &//原第二个节点前驱结点是原最后一个结点 &&& & & &s=p-& & & //s始终为p的下一个结点,然后循环&& & & }&& & }&&&}}2.39③ &试对稀疏多项式Pn(x)采用存储量同多项式项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0为给定值),并分析你的算法的时间复杂度。实现下列函数:float Evaluate(SqPoly pn, float x);/* pn.data[i].coef 存放ai, & & & & & & & & & & &*//* pn.data[i].exp存放ei (i=1,2,...,m) & & & & & &*//* 本算法计算并返回多项式的值。不判别溢出。 & & &*//* 入口时要求0≤e1&e2&...&em,算法内不对此再作验证*/多项式的顺序存储结构:typedef struct {&& int &&& int &} PolyTtypedef struct {&& PolyTerm *da&& int & & &} SqPfloat Evaluate(SqPoly pn, float x)/* pn.data[i].coef 存放ai, & & & & & & & & & & &*//* pn.data[i].exp存放ei (i=1,2,...,m) & & & & & &*//* 本算法计算并返回多项式的值。不判别溢出。 & & &*//* 入口时要求0≤e1&e2&...&em,算法内不对此再作验证*/{ int i,j;&&float p=1,s=0; & &&&for(i=0;i&pn.i++)&& { p=1;&& & for(j=pn.data[i].j&0;j--) p=p*x; &//计算指数项&& & s=s+pn.data[i].coef*p; & & & & //每加一项后的值&& &} &&& &&}◆2.41② &试以循环链表作稀疏多项式的存储结构,编写求其导函数的算法,要求利用原多项式中的结点空间存放其导函数(多项式),同时释放所有无用(被删)结点。实现下列函数:void Difference(LinkedPoly &pa);/* 稀疏多项式 pa 以循环链表作存储结构, & & *//* 将此链表修改成它的导函数,并释放无用结点 */链式多项式的类型定义:typedef struct PolyNode {&& &int &&& &int &&& &struct PolyNode *} PolyNode, *PolyL &// 多项式元素(项)结点类型typedef PolyLink LinkedP // 链式多项式void Difference(LinkedPoly &pa)/* 稀疏多项式 pa 以循环链表作存储结构, & & *//* 将此链表修改成它的导函数,并释放无用结点 */{ &LinkedPoly p,q;&& p=pa-& & & & &//标记第一个结点&& if(p-&exp==0) & & & & & //如果第一项的指数为0,则要把这项删除&& { q=p;&& & p=p-&&& & pa-&next=p; & & &&& & free(q);&& }&& while(p!=pa) & & & & & & &//当p不等于头结点时循环&& {p-&coef=p-&coef*p-& &//每一项的系数变成原来系数与指数的乘积&& &p-&exp--; & & & & & & & &//指数减1&& &p=p-&&& }&}
阅读(14956)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_085065',
blogTitle:'数据结构c语言版第二章习题答案共享',
blogAbstract:'\r\n&\r\n以下算法是我上机编出并验证过的,仅供需要的人参考啊\r\n千万别想不开去复制过去啊,学习也要自己努力才行啊!!!\r\n切记切记!!!\r\n&\r\n◆2.11② 设顺序表L中的数据元素递增有序。试写一算法,将x插入到L的适当位置上,并保持该表的有序性。\r\n要求实现下列函数:void InsertOrderList(SqList &L, ElemType x)/* 在有序的顺序表 L 中保序插入数据元素 x */\r\n顺序表类型定义如下:typedef struct {&&& ElemType *&&& int&&&&&&&&& int&&&&&&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:3,
permalink:'blog/static/',
commentCount:2,
mainCommentCount:2,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'骋我径寸翰,流藻垂华芳',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}1022人阅读
线性表的顺序存储实现
作者:Shmily
编译环境 VC++6.0
/**************************************************/
#include &stdio.h&
/**************************************************/
#define MaxSize 20
//线性表最大长度
#define OK
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int
typedef int
/**************************************************/
typedef struct {
ElemType data[MaxSize+1];
//为了操作方便,规定下标从1开始
//顺序表当前长度
/**************************************************/
Status SetNull(SqList *L)
L-&length = 0;
return OK;
/**************************************************/
//在末尾追加
Status append_arr(SqList *L, ElemType val)
if (L-&length & MaxSize)
return FALSE;
L-&data[++L-&length] =
return TRUE;
/**************************************************/
//求顺序表的长度
int GetLength(SqList *L)
return L-&
/**************************************************/
//输出顺序表
void DisLisy(SqList *L)
for (i=1; i&=L-& ++i)
printf(&%d &, L-&data[i]);
/**************************************************/
//顺序表判空
Status ListEmpty(SqList *L)
if (0 == L-&length)
return TRUE;
return FALSE;
/**************************************************/
//取得顺序表中第i个元素的值,放入e中
Status GetElem(SqList *L, int i, ElemType *e)
if (i&=0 || i&L-&length)
return ERROR;
*e = L-&data[i];
return OK;
/**************************************************/
//查找顺序表中是否有与e相同的元素
//若有则返回该元素的下标
//否则返回0
Status LocateElem(SqList *L, ElemType e)
for (i=1; i&=L-& ++i)
if (e == L-&data[i])
return FALSE;
/**************************************************/
//在顺序表中的第i个位置插入元素e
//若插入成功返回TRUE
//否则返回FALSE
Status ListInset(SqList *L, int i, ElemType e)
if ( (i&1 || i&L-&length+1)
&& (L-&length & MaxSize) )
return FALSE;
if (i&=L-&length)
for (k=L-& k&=i; --k)
L-&data[k+1] = L-&data[k];
L-&data[i] =
return TRUE;
/**************************************************/
//删除顺序表中第i个元素的值
//删除成功返回被删除的元素的值
//删除失败返回FALSE
Status ListDelete(SqList *L, int i, ElemType *e)
if (ListEmpty(L))
return FALSE;
if (i&1 || i&L-&length)
return FALSE;
*e = L-&data[i];
if (i&L-&length)
for (k=i; k&L-& ++k)
L-&data[k] = L-&data[k+1];
return TRUE;
/**************************************************/
int main(void)
SetNull(&L);
append_arr(&L, 3);
append_arr(&L, 2);
append_arr(&L, 6);
append_arr(&L, 2);
ListDelete(&L, 2, &e);
DisLisy(&L);
printf(&\n\n%d&, e);
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:120216次
积分:1878
积分:1878
排名:第11581名
原创:66篇
转载:32篇
评论:31条
(1)(5)(2)(2)(24)(1)(6)(3)(12)(12)(10)(11)(9)}

我要回帖

更多关于 c语言怎么创建线性表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信