//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status GetElem_L(LinkList L,int i,ElemType &e){
//L为带头结点的单链表的头指针。
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p;
int j;
p=L->next;j=1; //初始化,p指向第一个结点,j为计数器
while(p && j<i){ //顺指针向后查找,直到p指向第i个元素或p为空
p=p->next;++j;
}
if(!p || j>i) return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return OK;
}//GetElem_L
Status ListInsert_L(LinkList &L,int i,ElemType e){
//在带头结点的单链线性表L中第i个位置之前插入元素e
LinkList p,s;
int j;
p=L; j=0;
while(p && j<i-1){ //寻找第i-1个结点
p=p->next;++j;
}
if(!p || j>i-1) return ERROR; //i小于1或者大于表长加1
s=(LinkList)malloc(sizeof(LNode)); //生成新结点
s->data=e;s->next=p->next; //插入L中
p->next=s;
return OK;
}//ListInsert_L
Status ListDelete_L(LinkList &L,int i,ElemType e){
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q;
int j;
p=L; j=0;
while(p->next && j<i-1){ //寻找第i个结点,并令p指向其前趋
p=p->next;++j;
}
if(!(p->next) || j>i-1) return ERROR; //删除位置不合理
q=p->next;p->next=q->next; //删除并释放结点
e=q->data;free(q);
return OK;
}//ListInsert_L
void CreateList_L(LinkList &L,int n){
//逆位序输入n个元素的值,建立带表头结点的单链线性表L。
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //先建立一个带头结点的单链表
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data); //输入元素值
p->next=L->next;L->next=p; //插入到表头
}
}//CreateList_L
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){
//已至单链线性表La和Lb的元素按值非递减排序
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排序。
LinkList pa,pb,pc;
pa=La->next;pb=Lb->next;
Lc=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); //释放Lb的头结点
}//MergeList_L
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"
#include "LinkList.h"
int main(int argc, char* argv[])
{
LinkList L;
ElemType e;
ElemType in;
int n;
n=5;
CreateList_L(L,5);
GetElem_L(L,n,e);
printf("GetElem %d: %d ",n,e);
in=6;
ListInsert_L(L,5,in);
GetElem_L(L,n,e);
printf("GetElem %d: %d ",n,e);
return 0;
}