1个回答
展开全部
这是我自己根据清华大学出版社出版的《数据结构(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
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
//以下代码由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
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |