您的位置:首页 > 其它

链表的基本操作

2015-05-05 19:42 375 查看
#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INFEASIBLE -1

typedef int Status;
typedef int ElemType;

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

void InitList(LinkList &L);
void DestroyList(LinkList &L);
Status ListEmpty(LinkList L);
int ListLength(LinkList L);
int LocateElem(LinkList L,ElemType e,Status (* compare)(ElemType e1,ElemType e2));
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e);
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e);
Status InsertList(LinkList L,int i,ElemType e);
Status DeleteList(LinkList L,int i,ElemType &e);
void HeadCreList(LinkList &L,int n);
void TailCreList(LinkList &L,int n);
void ListTraverse(LinkList L,void (* visit)(ElemType e));

//辅助函数
bool equal(ElemType e1,ElemType e2);
void print(ElemType e);

/*
初始化链表
*/
void InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->data = NULL;
L->next = NULL;
}

/*
销毁链表
*/
void DestroyList(LinkList &L)
{
free(L);
L = NULL;
}

/*判断链表是否为空*/
Status ListEmpty(LinkList L)
{
if(L)
return TRUE;
else
return FALSE;
}

/*获取链表长度*/
int ListLength(LinkList L)
{
LinkList p = L->next;
int i = 0;
while(p)
{
p = p->next;
i++;
}
return i;
}

/*找到指定元素在链表中的位置*/
int LocateElem(LinkList L,ElemType e,bool (* compare)(ElemType,ElemType))
{
LinkList p = L->next;
int i=1;
while(p)
{
if(compare(p->data,e))
{
return i;
}
p=p->next;
i++;
}
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 InsertList(LinkList L,int i,ElemType e)
{
int j = 0;
LinkList p = L,pnew;
//找到前驱
while(j<i-1&&p)
{
p = p->next;
j++;
}
if(!p || j>i-1)
return ERROR;
pnew = (LinkList)malloc(sizeof(LNode));
if(!pnew)
exit(OVERFLOW);
pnew->data = e;
pnew->next = p->next;
p->next = pnew;
return OK;
}

/*
在链表中删除结点
*/
Status DeleteList(LinkList L,int i,ElemType &e)
{
int j=0;
LinkList p=L,q;//q用于指向要删除的结点
//找到第i个节点的前驱
while(j<i-1&&p->next)
{
p = p->next;
j++;
}
//前驱是尾结点,或者没有找到指定结点的前驱
if(!(p->next)&&j>i-1)
{
return ERROR;
}
q = p->next;
e = q->data;
p->next = q->next;
free(q);
q = NULL;
return OK;
}
/*
头插法创建链表
*/
void HeadCreList(LinkList &L,int n)
{
LinkList temp;
L = (LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next = NULL;
printf("please input %d elements.\n",n);
for(int i=0;i<n;i++)
{
temp = (LinkList)malloc(sizeof(LNode));
if(!temp)
exit(OVERFLOW);
scanf("%d",&(temp->data));
temp->next = L->next;
L->next = temp;
}
}

/*
尾插法创建链表
*/
void TailCreList(LinkList &L,int n)
{
LinkList temp,tail;
L = (LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next =  NULL;
tail = L;
printf("please input %d elements.\n",n);
for(int i=0;i<n;i++)
{
temp = (LinkList)malloc(sizeof(LNode));
if(!temp)
exit(OVERFLOW);
scanf("%d",&(temp->data));
temp->next = NULL;
tail->next = temp;
tail = temp;
}
tail->next = NULL;
}

/*
链表的遍历
*/
void ListTraverse(LinkList L,void (* visit)(ElemType e))
{
LinkList p = L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
}

/*
打印结点数据
*/
void print(ElemType e)
{
printf("%d ",e);
}

/*
判断是否相等
*/
bool equal(ElemType e1,ElemType e2)
{
if(e1==e1)
return true;
else
return false;
}

//测试各个基本功能
void main()
{
LinkList L;
int num;
printf("请输入要创建的链表的长度:");
scanf("%d",&num);
printf("----------------------------头插法创建链表------------------------------\n");
HeadCreList(L,num);
printf("创建链表后链表的长度为%d\n",ListLength(L));
printf("链表中的数据为:");
ListTraverse(L,print);
printf("----------------------------尾插法创建链表------------------------------\n");
//DestroyList(L);
TailCreList(L,num);
printf("创建链表后链表的长度为%d\n",ListLength(L));
printf("链表中的数据为:");
ListTraverse(L,print);
ElemType SearchItem;
printf("请输入查找的数据:");
scanf("%d",&SearchItem);
printf("%d在链表中的位置为%d\n",SearchItem,LocateElem(L,SearchItem,equal));
printf("---------------------------插入数据测试-----------------------------\n");
ElemType InsertItem;
int InsertPos;
printf("请输入要插入数据位置和数据:");
scanf("%d",&InsertPos);
scanf("%d",&InsertItem);
InsertList(L,InsertPos,InsertItem);
printf("插入%d后链表的数据为\n",InsertItem);
ListTraverse(L,print);
printf("--------------------------删除数据测试------------------------------\n");
int DelePos;
ElemType DeleItem;
printf("请输入删除数据所在的位置:");
scanf("%d",&DelePos);
DeleteList(L,DelePos,DeleItem);
printf("删除%d后链表中的数据为:",DeleItem);
ListTraverse(L,print);
}


-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: