#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<process.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status;
typedef int Boolean;
typedef int ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList;
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(struct LNode));
if(!*L)
exit(OVERFLOW);
(*L)->next=NULL;
return OK;
}
Status DestroyList(LinkList *L)
{
LinkList q;
while(*L)
{
q=(*L)->next;
free(*L);
*L=q;
}
return OK;
}
Status ClearList(LinkList L)
{
LinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
Status ListEmpty(LinkList L)
{
if(L->next)
return FALSE;
else
return TRUE;
}
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status GetElem(LinkList L,int i,ElemType *e)
{
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
int LocateElem(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType))
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(compare(p->data,e))
return i;
p=p->next;
}
return 0;
}
Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e)
{
LinkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==cur_e)
{
*pre_e=p->data;
return OK;
}
p=q;
}
return INFEASIBLE;
}
Status NextElem(LinkList L,ElemType cur_e,ElemType *next_e)
{
LinkList p=L->next;
while(p->next)
{
if(p->data==cur_e)
{
*next_e=p->next->data;
return OK;
}
p=p->next;
}
return INFEASIBLE;
}
Status ListInsert(LinkList L,int i,ElemType e)
{
int j=0;
LinkList p=L,s;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(struct LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList L,int i,ElemType *e)
{
int j=0;
LinkList p=L,q;
while(p->next&&j<i-1)
{
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;
}
Status ListTraverse(LinkList L,void(*vi)(ElemType))
{
LinkList p=L->next;
while(p)
{
vi(p->data);
p=p->next;
}
printf("\n");
return OK;
}
void InsertAscend(LinkList L,ElemType e)
{
LinkList q=L,p=L->next;
while(p&&e>p->data)
{
q=p;
p=p->next;
}
q->next=(LinkList)malloc(sizeof(struct LNode));
q->next->data=e;
q->next->next=p;
}
void InsertDescend(LinkList L,ElemType e)
{
LinkList q=L,p=L->next;
while(p&&e<p->data)
{
q=p;
p=p->next;
}
q->next=(LinkList)malloc(sizeof(struct LNode));
q->next->data=e;
q->next->next=p;
}
Status HeadInsert(LinkList L,ElemType e)
{
LinkList s;
s=(LinkList)malloc(sizeof(struct LNode));
s->data=e;
s->next=L->next;
L->next=s;
return OK;
}
Status EndInsert(LinkList L,ElemType e)
{
LinkList p=L;
while(p->next)
p=p->next;
p->next=(LinkList)malloc(sizeof(struct LNode));
p->next->data=e;
p->next->next=NULL;
return OK;
}
Status DeleteFirst(LinkList L,ElemType *e)
{
LinkList p=L->next;
if(p)
{
*e=p->data;
L->next=p->next;
free(p);
return OK;
}
else
return ERROR;
}
Status DeleteTail(LinkList L,ElemType *e)
{
LinkList p=L,q;
if(!p->next)
return ERROR;
while(p->next)
{
q=p;
p=p->next;
}
q->next=NULL;
*e=p->data;
free(p);
return OK;
}
Status DeleteElem(LinkList L,ElemType e)
{
LinkList p=L,q;
while(p)
{
q=p->next;
if(q&&q->data==e)
{
p->next=q->next;
free(q);
return TRUE;
}
p=q;
}
return FALSE;
}
Status ReplaceElem(LinkList L,int i,ElemType e)
{
LinkList p=L;
int j=0;
while(p->next&&j<i)
{
j++;
p=p->next;
}
if(j==i)
{
p->data=e;
return OK;
}
else
return ERROR;
}
Status CreatAscend(LinkList *L,int n)
{
int j;
LinkList p,q,s;
if(n<=0)
return ERROR;
InitList(L);
printf("请输入%d个元素:\n",n);
s=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&s->data);
s->next=NULL;
(*L)->next=s;
for(j=1;j<n;j++)
{
s=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&s->data);
q=*L;
p=(*L)->next;
while(p&&p->data<s->data)
{
q=p;
p=p->next;
}
s->next=q->next;
q->next=s;
}
return OK;
}
Status CreatDescend(LinkList *L,int n)
{
int j;
LinkList p,q,s;
if(n<=0)
return ERROR;
InitList(L);
printf("请输入%d个元素:\n",n);
s=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&s->data);
s->next=NULL;
(*L)->next=s;
for(j=1;j<n;j++)
{
s=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&s->data);
q=*L;
p=(*L)->next;
while(p&&p->data>s->data)
{
q=p;
p=p->next;
}
s->next=q->next;
q->next=s;
}
return OK;
}
Status GetFirstElem(LinkList L,ElemType *e)
{
LinkList p=L->next;
if(!p)
return ERROR;
else
*e=p->data;
return OK;
}
void visit(ElemType c)
{
printf("%d ",c);
}
int main()
{
LinkList L;
ElemType d,e;
Status i;
int n;
printf("按非降序建立n个元素的线性表L,请输入元素个数n: ");
scanf("%d",&n);
CreatAscend(&L,n);
printf("依次输出L的元素:");
ListTraverse(L,visit);
InsertAscend(L,10);
printf("按非降序插入元素10后,线性表L为:");
ListTraverse(L,visit);
HeadInsert(L,12);
EndInsert(L,9);
printf("在L的头部插入12,尾部插入9后,线性表L为:");
ListTraverse(L,visit);
i=GetFirstElem(L,&e);
printf("第1个元素是: %d\n",e);
printf("请输入要删除的元素的值: ");
scanf("%d",&e);
i=DeleteElem(L,e);
if(i)
printf("成功删除%d!\n",e);
else
printf("不存在元素%d!\n",e);
printf("线性表L为:");
ListTraverse(L,visit);
printf("请输入要取代的元素的序号 元素的新值: ");
scanf("%d%d",&n,&e);
ReplaceElem(L,n,e);
printf("线性表L为:");
ListTraverse(L,visit);
DestroyList(&L);
printf("销毁L后,按非升序重新建立n个元素的线性表L,请输入元素个数n(>2): ");
scanf("%d",&n);
CreatDescend(&L,n);
printf("依次输出L的元素:");
ListTraverse(L,visit);
InsertDescend(L,10);
printf("按非升序插入元素10后,线性表L为:");
ListTraverse(L,visit);
printf("请输入要删除的元素的值: ");
scanf("%d",&e);
i=DeleteElem(L,e);
if(i)
printf("成功删除%d!\n",e);
else
printf("不存在元素%d!\n",e);
printf("线性表L为:");
ListTraverse(L,visit);
DeleteFirst(L,&e);
DeleteTail(L,&d);
printf("删除表头元素%d和表尾元素%d后,线性表L为:",e,d);
ListTraverse(L,visit);
}