介绍:
1、构造一个长为n的线性表,插入元素为逆序插入
2、构造一个长为n的线性表,插入元素为顺序插入
3、销毁链表L
4、查找L的第i个元素,并用e返回
5、查找L中第一个与e满足compare关系的元素,若存在返回其对应位置,否则返回error
6、若cur_e是L中的元素,且不是第一个,则返回其前驱元素
7、若cur_e是L中的元素,且不是最后一个,返回其对应后继元素
8、在L的第i个位置插入元素e
9、删除L的第i个元素
链表结构的实现:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <assert.h>
typedef int Elemtype;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef struct Node
{
Elemtype data;
struct Node * next;
}LinkNode,*LinkList;
/*
构造一个空的线性表
*/
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LinkNode));
if(!L)
{
printf("L failed");
return ERROR;
}
L->next=NULL;
return OK;
}
/*
构造一个长为n的线性表,插入元素为逆序插入
*/
Status ListCreate_Invert(LinkList &L,const int n)
{
int i;
InitList(L);
LinkList p;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LinkNode));
if(!p)
{
printf("p failed ");
return ERROR;
}
scanf("%d", &p->data);
p->next=L->next;
L->next=p;
}
return OK;
}
/*
构造一个长为n的线性表,插入元素为顺序插入
*/
Status ListCreate_Sequence(LinkList &L,const int n)
{
int i;
InitList(L);
LinkList p,q=L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LinkNode));
if(!p)
{
printf("p failed ");
return ERROR;
}
scanf("%d", &p->data);
q->next=p;
q=p;
}
q->next=NULL;
return OK;
}
/*
销毁线性表L
*/
Status DestroyList(LinkList &L)
{
LinkList p=L->next,q;
free(L);
while(p)
{
q=p->next;
free(p);
p=q;
}
return OK;
}
/*
将L重置为空表
*/
Status ClearList(LinkList &L)
{
LinkList p=L->next,q;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
/*
判断L是否为空,空返回True,否则返回False
*/
Status EmptyList(const LinkList L)
{
if(L->next==NULL)
return TRUE;
else
return FALSE;
}
/*
返回L的长度
*/
Status ListLength(const LinkList L)
{
LinkList p=L;
int length=0;
while(p->next)
{
++length;
p=p->next;
}
return length;
}
/*
查找L的第i个元素,并用e返回
*/
Status GetElem(const LinkList L,int i,Elemtype &e)
{
assert(i>0);
int j=0;
LinkList p=L;
while (j<i&&p)
{
++j;
p=p->next;
}
if(p==NULL||j>i)
{
printf("there aren't %d elements is the linklist\n", i);
return FALSE;
}
e=p->data;
return OK;
}
/*
查找L中第一个与e满足compare关系的元素,若存在返回其对应位置,否则返回error
*/
Status LocateElem(const LinkList L,Elemtype e,Status (*compare)(Elemtype,Elemtype))
{
LinkList p=L->next;
int pos=1;
while(p)
{
if(compare(e,p->data)==1)
return pos;
else
{
pos++;
p=p->next;
}
}
if(p==NULL)
{
printf("no element has the compare relation with %d \n", e);
return FALSE;
}
}
//若cur_e是L中的元素,且不是第一个,则返回其前驱元素
Status PriorElem(const LinkList L,Elemtype cur_e,Elemtype &pre_e)
{
int pos=1;
LinkList p=L;
while (p->next&&p->next->data!=cur_e)
{
p=p->next;
pos++;
}
if(pos!=1) //不是第一个结点
{
pre_e=p->data;
return OK;
}
else
{
printf("%d is the first element of linklist\n", cur_e);
return ERROR;
}
}
//若cur_e是L中的元素,且不是最后一个,返回其对应后继元素
Status NextElem(const LinkList L,Elemtype cur_e,Elemtype &next_e)
{
int pos=1;
LinkList p=L->next;
while(p&&p->data!=cur_e)
{
p=p->next;
pos++;
}
if(p->next!=NULL)
{
next_e=p->next->data;
return OK;
}
else
{
printf("%d is the last element of linklist\n", cur_e);
return ERROR;
}
}
//在L的第i个位置插入元素e
Status InsertList(LinkList &L,int i,Elemtype e)
{
assert(i>0);
LinkList p=L->next;
int j=1;
while(p&&j<i-1)
{
p=p->next;
++j;
}
LinkList s=(LinkList)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
/*
删除L的第i个元素
*/
Status DeleteList(LinkList &L,int i,Elemtype &e)
{
assert(i>0);
LinkList p=L->next;
int j=1;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
LinkList q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
/*
对L中的每一个元素调用visit函数
*/
Status TraverseList(const LinkList L,void(*visit)(Elemtype))
{
LinkList p;
p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
return OK;
}
void visit(Elemtype e)
{
printf("%-5d", e);
}
测试代码:
//测试代码
int main()
{
LinkList L;
int n;
LinkNode *p,*emin,*emax;
printf("请输入要要输入的元素个数:");
scanf("%d", &n);
ListCreate_Sequence(L, n);
printf("原序链表值:\n");
p = L->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
p = L;
int ce, pe;
printf("请输入要查找前驱和后继的元素:");
scanf("%d", &ce);
PriorElem(L, ce, pe);
printf("%d的前驱是%d\n", ce, pe);
NextElem(L, ce, pe);
printf("%d的后继是%d\n", ce, pe);
printf("请输入要插入的元素和插入位置:");
scanf("%d%d", &ce,&pe);
InsertList(L, pe,ce);
printf("插入元素%d后的线性表为\n", ce);
TraverseList(L, visit);
puts("");
printf("请输入要删除元素位置:");
scanf("%d", &ce);
DeleteList(L, ce, pe);
printf("删除%d位置的元素后的线性表为\n", ce);
TraverseList(L, visit);
puts("");
DestroyList(L);
return 0;
}
运行结果: