数据结构作业

用链表法存储一个含有是个整数的数组,将其按升序排列,并找出其中的奇数... 用链表法存储一个含有是个整数的数组,将其按升序排列,并找出其中的奇数 展开
 我来答
陈学阳
2010-09-18 · TA获得超过2.8万个赞
知道大有可为答主
回答量:2.1万
采纳率:14%
帮助的人:5530万
展开全部
这是我自己根据清华大学出版社出版的《数据结构(C语言版)》课本线性链表那章里面一些算法写的一个关于线性链表的一个头文件,自我感觉很好用。。而已一直在用。。取名LinkList.h。。注释特详细。。肯定能对你有帮助。。代码如下:
//以下代码由Sylar编写
#include "stdlib.h"
#include "stdio.h"

#define ElemType int //以int为例
#define ScanfType "%d" //以int为例
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

Status GetElem_L(LinkList L,int i,ElemType *pe){ //算法2.8,P29,时间复杂度O(n)
//L为带头结点的单链表的头指针
//当第耐游凳i个元素存在时昌旅,其值赋给e并返回OK,否则磨芦返回ERROR
LinkList p=L->next;int j=1; //初始化,p指向第一个结点,j为计数器
while(p&&j<i){ //顺指针向后查找,直到p指第i个元素或p为空
p=p->next;++j;
}
if(!p||j>i) return ERROR; //第i个元素不存在
*pe=p->data;
return OK;
}//GetElem_L

Status ListInsert_L(LinkList *pL,int i,ElemType e){ //算饭2.9,P30,时间复杂度O(n)
//在带头结点的单链线性表L中第i个位置之前插入元素e
LinkList p=*pL;int j=0;
while(p&&j<i-1){ //寻找第i-1个结点
p=p->next;++j;
}
if(!p||j>i-1) return ERROR; //i小于或者大于表长则返回ERROR
LinkList s=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e;s->next=p->next;p->next=s; //插入L中
return OK;
}//ListInsert_L

Status ListDelete_L(LinkList *pL,int i,ElemType *pe){ //算饭2.10,P30,时间复杂度O(n)
//在带头结点的单链线性表L中,删除第i个元素,并由*pe返回其值
LinkList p=*pL;int j=0;
while(p&&j<i-1){ //寻找第i个结点,并令p指向其前趋
p=p->next;++j;
}
if(!p||j>i-1) return ERROR; //删除位置不合理
LinkList q;
q=p->next;*pe=q->data;p->next=q->next;free(q); //删除并释放结点
return OK;
}//ListDelete_L

Status ListDelete_L2(LinkList *pL,int i){ //时间复杂度O(n)
//在带头结点的单链线性表L中,删除第i个元素
LinkList p=*pL;int j=0;
while(p&&j<i-1){ //寻找第i个结点,并令p指向其前趋
p=p->next;++j;
}
if(!p||j>i-1) return ERROR; //删除位置不合理
LinkList q;
q=p->next;p->next=q->next;free(q); //删除并释放结点
return OK;
}//ListDelete_L2

void CreateList_L(LinkList *pL,int n){ //算法2.1,P30
//逆序输入n个元素的值,建立带表头结点的单链线性表L
LinkList L=*pL=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //建立带表头结点的单链表
for(int i=0;i<n;i++){
LinkList q=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf(ScanfType,&q->data); //插入元素值
q->next=L->next;L->next=q;
}
}//CreateList_L

void CreateList_L2(LinkList *pL,int n){
//顺序输入n个元素的值,建立带表头结点的单链线性表L
LinkList L=*pL=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //建立带表头结点的单链表
LinkList p=*pL;
for(int i=0;i<n;i++){
LinkList q=(LinkList)malloc(sizeof(LNode)); //生成新结点
p->next=q;
scanf(ScanfType,&q->data); //插入元素值
q->next=NULL;
p=q;
}
}//CreateList_L2

void MergeList_L(LinkList La,LinkList Lb,LinkList *pLc){ //算法2.12,P31
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
LinkList pa,pb,pc;
pa=La->next; pb=Lb->next;
*pLc=pc=La; //用La的头结点作为Lc的头结点
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;pc=pa;pa=pa->next;
}
else{
pc->next=pb;pc=pb;pb=pb->next;
}
}
pc->next=pa?pa:pb; //插入剩余段
free(Lb);
}//MergeList_L

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式