线性表的基本操作

来源:互联网 发布:网络电视直播手机版 编辑:程序博客网 时间:2024/05/17 02:39
#include <stdio.h>#include <stdlib.h> //malloc exit//线性表的顺序存储结构#define MAXSIZE 20typedef int ElemType;typedef struct{ElemType data[MAXSIZE];int length;}SqList;#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status//用e返回L中第i个数据元素的值Status GetElem(SqList L,int i,ElemType *e){if(L.length==0||i<1||i>L.length)return ERROR;*e=L.data[i-1];return OK;}//在L中第i个位置之前插入新的数据元素e,L的长度加1Status ListInsert(SqList *L,int i,ElemType e){int k;if(L->length==MAXSIZE)return ERROR;if(i<1||i>L->length+1)return ERROR;if(i<=L->length) //若要插入的数据位置不在表尾{for(k=L->length-1;k>=i-1;k--)L->data[k+1]=L->data[k];}L->data[i-1]=e;L->length++;return OK;}//删除操作Status ListDelete(SqList *L,int i,ElemType *e){int k;if(L->length==0)return ERROR;if(i<1||i>L->length)return ERROR;*e=L->data[i-1];if(i<L->length) //如果删除不是最后位置{for(k=i;k<L->length;k++)  L->data[k-1]=L->data[k];}L->length--;return OK;}//线性表的单链表存储结构typedef struct Node{ElemType data;struct Node *next;}Node,*LinkList;//用e返回L中第i个数据元素的值Status GetElem(LinkList L,int i,ElemType *e){int j;LinkList p;p=L->next;while(p&&j<i) {p=p->next;j++;}if(!p||j>i)return ERROR;*e=p->data;return OK;}//在L中第i个位置之前插入新的数据元素e,L的长度加1Status LinkInsert(LinkList *L,int i,ElemType e){int j;LinkList p,s;p=*L;j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i)return ERROR;s=(LinkList)malloc(sizeof(Node));s->data=e;s->next=p->next;p->next=s;return OK;}//删除L的第i个数据元素,并用e返回其值,L的长度减1Status ListDelete(LinkList *L,int i,ElemType *e){int j;LinkList p,q;p=*L;j=1;while(p->next&&j<i) //找到第i个元素的前驱{p=p->next;j++;}if(!(p->next)||j>i)return ERROR;  //第i个元素不存在q=p->next;p->next=q->next;*e=q->data;free(q);return OK;}//单链表的整表创建//逆序插入void CreateListHead(LinkList *L,int n){LinkList p;int i,data;*L=(LinkList)malloc(sizeof(Node));(*L)->next=NULL;for(i=0;i<n;i++){scanf("%d",&data); //1 2 3 4 5....p=(LinkList)malloc(sizeof(Node));p->data=data;p->next=(*L)->next;(*L)->next=p;}}//顺序插入void CreateListHead(LinkList *L,int n){LinkList p,r;int i,data;*L=(LinkList)malloc(sizeof(Node));(*L)->next=NULL;r=(*L);for(i=0;i<n;i++){scanf("%d",&data); //1 2 3 4 5....p=(LinkList)malloc(sizeof(Node));p->data=data;r->next=p;r=p;}r->next=NULL;}//单链表的整表删除Status ClearList(LinkList *L){LinkList p,q;p=(*L)->next;while(p){q=p->next;free(p);p=q;}(*L)->next=NULL;return OK;}//单链表的逆置//带头结点的单链表的逆置运算void reverse(LinkList h){LinkList p,q;p=h->next;h->next=NULL;while(p!=NULL){q=p;p=p->next;  //依次链接q->next=h->next;  //将q所指结点链接到新链表中h->next=q;  //头结点指向新链接的结点,也就会第一个结点}}//不带头结点的单链表的逆置运算void reverse(LinkList &L){p=null;q=L;while(q!=null){L=L->next;  //暂存下一个结点否则执行下一步时,就被覆盖了找不到了q->next=p; //q是带操作结点,p是上一个结点p=q;  //将本结点设置为上一个结点q=L;  //将暂存的结点设为待操作的结点}L=p; //将第一个结点设置为L}//静态链表#define MAXSIZE 1000typedef struct{ElemType data;int cur;}Component,StaticLinkList[MAXSIZE];//将一维数组space中各分量链成一备用链表//对数组第一个和最后一个元素作为特殊元素处理,不存数据,通常//把未被使用的数组元素称为备用链表//数组第一个元素即下标为0的元素存放备用链表第一个结点的下标,而数组的最后一个元素//则存放第一个有数值元素的下标,相当于单链表中头结点作用//当整个链表为空时,为0Status InitList(StaticLinkList space){int i;for(i=0;i<MAXSIZE-1;i++)space[i].cur=i+1;space[MAXSIZE-1].cur=0;}//实现malloc和free函数//若备用空间链表非空,则返回分配的结点下标,否则返回0int Malloc_SLL(StaticLinkList space){int i=space[0].cur;if(space[0].cur)space[0].cur=space[i].cur;return i;}void Free_SSL(StaticLinkList space,int k){space[k].cur=space[0].cur;space[0].cur=k;}//求长度int ListLength(StaticLinkList L){int j=0;int i=L[MAXSIZE-1].cur;while(i){i=L[i].cur;j++;}return j;}//在L中第i个元素之前插入新的数据元素Status ListInsert(StaticLinkList L,int i,ElemType e){int j,k,l;k=MAXSIZE-1;  //k首先是最后一个元素的下标if(i<1||i>ListLength(L)+1)return ERROR;j=Malloc_SLL(L);//获得空闲分量的下标if(j){L[j].data=e;for(l=1;l<=i-1;l++)k=L[k].cur;L[j].cur=L[k].cur;L[k].cur=j;return OK;}return ERROR;}//删除L中第i个数据元素eStatus LinkDelete(StaticLinkList L,int i){int j,k;if(i<1||i>LinkLength(L))return ERROR;k=MAXSIZE-1;for(j=1;j<i-1;j++)k=L[k].cur;j=L[k].cur;L[k].cur=L[j].cur;Free_SSL(L,j);return OK;}//双向链表//将结点s插入到结点p和p->next之间的步骤//s->prior=p;//s->next=p->next;//p->next->prior=s;//p->next=s;//删除结点p//p->prior->next=p->next;//p->next->prior=p->prior;//free(p);

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 富士康smt上错料怎么办 语音清唱太难听怎么办 酷狗里找不到的歌怎么办 iphone6话筒坏了怎么办 iphone听筒坏了怎么办 iphone话筒坏了怎么办 115邮箱无法登陆怎么办 群超时无法撤回怎么办 被加州大学撤回录取怎么办 ppt转码失败怎么办 苹果xicloud满了怎么办 小米note3不充电怎么办 网易云海外会员怎么办 百度云支付失败怎么办 信用卡输入密码错误怎么办 相机储存卡被锁怎么办 sd卡检测不到怎么办 手机图标闪退怎么办 电视看爱奇艺版权受限怎么办 王者荣耀重复id怎么办 拼多多资源位下架怎么办 百度云网络异常怎么办 公开课没上好怎么办 ios云备份失败怎么办 网易云登录异常怎么办? 阴阳师网易账号冻结怎么办 梦幻账号被冻结怎么办 手机忘记解锁密码怎么办 胃疼持续一天怎么办 胃痛一天一夜怎么办 孩子爱玩电脑怎么办 ipad不显示画面怎么办 正版win10换电脑怎么办 电脑系统不是正版怎么办 苹果平板进水了怎么办 华为平板进水了怎么办 三星平板进水了怎么办 笔记本cpu运行过高怎么办 微博永久性封号怎么办 电脑占用内存多怎么办 直播签约后悔了怎么办