ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:24.57KB ,
资源ID:9378674      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9378674.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构算法举例.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构算法举例.docx

1、数据结构算法举例一、顺序表的算法1、 使用结构描述顺序表#define ListSize 100 /假定表容量为100 typedef int DataType;/DataType代表的类型为int型typedef struct DataType dataListSize;/数组data用于存放表结点 int length; /当前表的长度(结点数) SeqList;1、顺序表的初始化void initList(SeqList *L)/将当前表L的表长L-length置为0 L-length=0;2、求顺序表的长度int LengthList(SeqList *L)/返回顺序表L的表长L-le

2、ngth return L-length;3、取表元DataType GetList(SeqList *L,int i)/返回顺序表L的第i个结点的值L-datai-1 return L-datai-1;4、顺序表插入操作 void InsertList(SeqList *L,DataType t,int i)/将t插入顺序表L的第i个结点的位置上 int j; if (iL-length+1) puts(插入位置错);exit(0); if (L-length=ListSize) puts(表满不能插入);exit(0); else for(j=L-length-1;j=i-1;j-) L-

3、dataj+1=L-dataj; /结点依次后移 L-datai-1=t; /插入t L-length+; /表长加1 5、顺序表删除操作void DeleteList(SeqList *L,int i)/从顺序表L中删除第i个结点 int j; if (iL-length) puts(删除位置错);exit(0); if (L-length=0) puts(空表不能删除);exit(0); else for(j=i;jlength-1;j+) L-dataj-1=L-dataj; /结点依次前移 L-length-; /表长减1 6、顺序表按值查找int SearchList(SeqList

4、 *L,DataType t)/从顺序表L中查找值为t的结点,找到返回位置值i,否则返回-1 int i=1; while (ilength& L-datai-1!=t) i+; if(L-datai-1=t) return i; else return -1; 二、链表的算法举例0、(链表)结点的描述typedef char DataType; /定义结点的数据域类型typedef struct node /结点类型定义DataType data; /结点数据域struct node *next; /结点指针域ListNode; /结构体类型标识符typedef ListNode *Link

5、List; ListNode *p; /定义一个指向结点的指针LinkList head; /定义指向链表的头指针2、 节点的申请和释放p=( ListNode *)malloc(sizeof(ListNode);/申请节点free(p); /释放节点2、头插法建单链表算法的实现LinkList CreatListF(void)/返回单链表的头指针 DataType ch; LinkList head; /头指针 ListNode *s; /工作指针 head=NULL; /链表开始为空 printf(请输入链表各结点的数据:n); while(ch=getchar()!=n) s=(List

6、Node *)malloc(sizeof(ListNode ); s-data=ch;s-next=head; head=s; return head; 3、尾插法建单链表算法的实现LinkList CreatListR(void)/返回单链表的头指针 DataType ch; LinkList head;/头指针 ListNode *s,*r; /工作指针 head=NULL; /链表开始为空 r=NULL;/尾指针初值为空 while(ch=getchar()!=n) s=(ListNode *)malloc(sizeof(ListNode); s-data=ch; if(head=NUL

7、L) head=s;/新结点插入空表 else r-next=s;/将新结点插到链表尾 r=s;/尾指针指向新表尾 if(r!=NULL) r-next=NULL; return head; 4、尾插法建立带头结点的单链表算法的实现LinkList CreatListRH(void)/用尾插法建立带头结点的单链表 DataType ch; LinkList head; ListNode *s,*r;/工作指针 head=(ListNode *)malloc(sizeof(ListNode); r=head;/尾指针初值也指向头结点 printf(请输入链表各结点的数据(字符型):n); whi

8、le(ch=getchar()!=n) s=(ListNode *)malloc(sizeof(ListNode); s-data=ch; r-next=s;/将新结点插到链表尾 r=s;/尾指针指向新表尾 r-next=NULL; return head; 5、求带头结点的单链表表长算法实现int LengthListH(LinkList head)/求带头结点的单链表的表长 ListNode *p=head;/p指向头结点 int j=0; while(p-next) p=p-next;/使p指向下一个结点 j+; return j;6、求不带头结点的单链表表长算法实现int Length

9、List (LinkList head)/求不带头结点的单链表的表长 ListNode *p=head;/p指向开始结点 int j; if(p=NULL)/处理空表 return 0; j=1; /处理非空表 while(p-next) p=p-next;/使p指向下一结点 j+; return j; 7、按序号在带头结点的单链表中查找算法实现ListNode* GetNode(LinkList head,int i)/在带头结点的单链表head中查找第i个结点,若找到(0in),则返回该结点的存储地址,否则返回NULL。 int j=0; ListNode *p=head;/从头结点开始扫

10、描 while(p-next!=NULL&jnext; j+; if(i=j) return p;/找到了第i个结点 else return NULL; 8、按值在带头结点的单链表中查找算法实现ListNode *LocateNode (LinkList head,DataType key)/在带头结点的单链表head中查找其值为key的结点 ListNode *p=head-next; while(p&p-data!=key)/p等价于p!=NULL p=p-next; return p; 9、带头结点单链表的插入算法实现void InsertList(LinkList head,DataT

11、ype x,int i)/将值为x的新结点插入到带头结点的单链表head的第i个结点的位置上 ListNode *p,*s; p=GetNode(head,i-1);/寻找第i-1个结点 if(p=NULL) printf(未找到第%d个结点,i-1);exit(0); s=(ListNode *)malloc(sizeof(ListNode); s-data=x; s-next=p-next; p-next=s; 10、带头结点单链表的删除算法实现void DeleteList(LinkList head,int i)/删除带头结点的单链表head上的第i个结点 ListNode *p,*r

12、; p=GetNode(head,i-1);/找到第i-1个结点 if(p=NULL|p-next=NULL) printf(未找到第%d个结点,i-1); exit(0); r=p-next;/使r指向被删除的结点ai p-next=r-next;/将ai从链上摘下 free(r);/释放结点ai的空间 11、双向链表的描述:typedef char DataType;/定义结点的数据域类型typedef struct dlistnode /结点类型定义 DataType data; /结点的数据域 struct dlistnode *prior,*next; /结点的指针域DListNod

13、e; /结构体类型标识符typedef DListNode *DLinkList; / 定义新指针类型DListNode *p,*s; / 定义工作指针DLinkList head; / 定义头指针 12、双向链表的前插操作算法void DInsertBefore(DListNode *p,DataType x) DListNode *s=malloc(sizeof(DListNode);s-data=x;s-prior=p-prior;s-next=p;p-prior-next=s;p-prior=s;13、双向链表的当前结点的删除操作算法void DDeleteNode(DListNode

14、 *p) p-prior-next=p-next;p-next-prior=p-prior;free(p);14、顺序表的划分算法:void Part(SeqList *L) int i,j; DataType x,y;/存放基准和当前小于基准的结点 x=L-data0;/将基准置入x中 for(i=1;ilength;i+) if(L-dataidatai;/将当前小于基准的置入y for(j=i-1;j=0;j-) L-dataj+1= L-dataj; L-data0=y; 15、顺序表的合并算法:void Merge(SeqList A, SeqList B,SeqList *C) i

15、nt i,j,k; i=0;j=0;k=0; while(iA.length&jB.length) if(A.datai datak+=A.datai+; else C- datak+=B.dataj+; while(i datak+=A.datai+; while(j datak+=B.dataj+; C-length=k; 三、栈的算法举例0、顺序栈的描述#define StackSize 100 /假定栈空间最多为100个元素typedef char DataType;/假定栈元素的类型为字符类型typedef structDataType dataStackSize;/栈元素定义int

16、 top;/栈指针定义SeqStack; SeqStack *S;/栈定义1、置栈空void InitStack(SeqStack *S)/将顺序栈置空 S-top=-1; 1、判栈空int StackEmpty(SeqStack *S) return S-top=-1; 3、判栈满int StackFull(SeqStack *S) return S-top=StackSize-1; 4、进栈void Push(SeqStack *S,DataType x) if (StackFull(S) puts(栈满); exit(0);/栈满时,退出程序运行 S-data+S-top=x;/栈顶指针

17、加1后将x入栈 5、退栈DataType Pop(SeqStack * S) if(StackEmpty(S)puts(栈空); exit(0);/栈空时,退出程序运行 return S-dataS-top-;/返回栈顶元素并将栈顶指针减1 6、取栈顶元素DataType StackTop(SeqStack *S) if(StackEmpty(S) puts(栈空); exit(0); return S-dataS-top; 7、链栈的描述typedef char DataType;/假定栈元素类型为字符型typedef struct stacknodeDataType data; struc

18、t stacknode *next;StackNode;typedef struct/栈的描述StackNode *top; /栈顶指针LinkStack; 8、置链栈空 void InitStack(LinkStack *S)/将链栈置空 S-top=NULL; 9、判链栈空int StackEmpty(LinkStack *S) return S-top=NULL; 10、 进链栈void Push(LinkStack *S,DataType x )/将元素x插入链栈头部StackNode*p=(StackNode*)malloc(sizeof(StackNode);p-data=x;p-

19、next=S-top;/将新结点*p插入链栈头部S-top=p; /栈顶指针指向新结点 11、退链栈DataType Pop(LinkStack *S)DataType x;StackNode *p=S-top;/保存栈顶指针if(StackEmpty(S) puts(“栈空”); exit(0);/下溢,退出运行x=p-data; /保存栈顶结点数据S-top=p-next; /将栈顶结点从链上摘下free(p);return x; 12、取链栈栈顶顶元素DataType StackTop(LinkStack *S) if(StackEmpty(S) puts(“栈空”); exit(0);

20、 return S-top-data; 四、队列的算法举例1、循环队列的描述#define QueueSize 100 /定义队列最大容量typedef char DataType; /定义队列元素类型typedef struct cirqueue DataType dataQueueSize;/队列元素定义 int front;/头指针定义 int rear; /尾指针定义 int count; /计数器定义 CirQueue; 2、置队空void InitQueue(CirQueue *Q) Q-front=Q-rear=0; Q-count=0; /计数器置0 3、判队空int Queu

21、eEmpty(CirQueue *Q) return Q-count=0; /队列无元素为空4、判队满int QueueFull(CirQueue *Q) return Q-count=QueueSize;/队中元素个数等于QueueSize时队满5、入队void EnQueue(CirQueue *Q,DataType x) if(QueueFull(Q) puts(“队满”); exit(0); /队满上溢Q-count +; /队列元素个数加1Q-dataQ-rear=x; /新元素插入队尾Q-rear=(Q-rear+1)%QueueSize; /循环意义下将尾指针加16、出队Data

22、Type DeQueue(CirQueue *Q) DataType temp; if(QueueEmpty(Q) puts(“队空”); exit(0); /队空下溢 temp=Q-dataQ-front; Q-count-; /队列元素个数减1 Q-front=(Q-front+1)%QueueSize; /循环意义下的头指针加1 return temp; 7、取队头元素DataType QueueFront(CirQueue *Q) if(QueueEmpty(Q) puts(“队空”); exit(0); return Q-dataQ-front;8、链队列的描述typedef str

23、uct queuenode/队列中结点的类型DataType data;struct queuenode *next;QueueNode;typedef structQueueNode *front; /队头指针 QueueNode *rear; /队尾指针LinkQueue; 9、链队列置空 void InitQueue(LinkQueue *Q) Q-front=Q-rear=NULL; 10、链队列判队空 int QueueEmpty(LinkQueue *Q) return Q-front=NULL&Q-rear=NULL;/实际上只须判断队头指针是否为空即可11、链队列入队 void

24、 EnQueue(LinkQueue *Q,DataType x)/将元素x插入链队列尾部 QueueNode *p; p=(QueueNode *)malloc(sizeof(QueueNode); p-data=x; p-next=NULL;if(QueueEmpty(Q) Q-front=Q-rear=p; /将x插入空队列else /x插入非空队列的尾 Q-rear-next=p; /*p链到原队尾结点后Q-rear=p; /队尾指针指向新的尾12、链队列出队 DataType DeQueue (LinkQueue *Q) DataType x; QueueNode *p; if(Qu

25、eueEmpty(Q) puts(“队空”); exit(0);p=Q-front;/指向队头结点x=p-data;/保存队头结点的数据Q-front=p-next;/将对头结点从链上摘下if(Q-rear=p)/原队中只有一个结点,删去后队列 变空,此时队头指针已为空 Q-rear=NULL;free(p); /释放被删队头结点return x; /返回原队头数据13、取队头元素DataType QueueFront(LinkQueue *Q) if(QueueEmpty(Q) puts(“队空”); exit(0); return Q-front-data;五、树的算法举例1、二叉树顺序存储结构的描述#define MAXSIZE 50 /设置二叉树的最大结点数typedef char DataType; /定义结点类型typedef struct /定义二叉树结构 DataType btMAXSIZE; /存放二叉树的结点 int num; /存放二叉树的结点数SeqBT;2、结点的类型说明typedef char DataType; /定义结点数据域类型typedef struct node/定义结点结构 DataType data; struct node *lchild,*rchild; /左右孩子指针Bin

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1