#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW 0
#define ERROR -1
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
LNode *next;
}LNode, *LinkList;//struct LNode *LinkList;
void InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
if(!L)
{
exit(OVERFLOW);
}
L->next = NULL;
}
void DestroyList(LinkList &L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
L = NULL;
}
void ClearList(LinkList L)
{
LinkList p = L->next;
L->next = NULL;
DestroyList(p);
}
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 InsertList(LinkList L, int i, ElemType e)
{
int j = 0;
LinkList p = L;
while(p && j < i - 1)
{
p = p->next;
j++;
}
if(!p || j > i - 1)
{
return ERROR;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
if(!s)
{
exit(OVERFLOW);
}
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status GetElem(LinkList L, int i, ElemType &e)
{
int j = 1;
LinkList p = L->next;
while(p && j < i)
{
j++;
p = p->next;
}
if(!p || j > i)
{
return ERROR;
}
e = p->data;
return OK;
}
int LocateElem(LinkList L, ElemType e)
{
int i = 0;
LinkList p = L->next;
while(p)
{
i++;
if(p->data == e)
return i;
p = p->next;
}
return 0;
}
Status DeleteList(LinkList L, int i, ElemType &e)
{
int j = 0;
LinkList p = L;
while(p && j < i - 1)
{
p = p->next;
j++;
}
if(!p->next || j > i - 1)
{
exit(OVERFLOW);
}
LinkList q = p->next;
e = q->data;//e = p ->next->data;
p->next = q->next;//p->next = p->next->next;
free(q);
return OK;
}
void print(ElemType e)
{
printf("%d ", e);
}
void ListTraverse(LinkList L, void(*visit)(ElemType))
{
LinkList p = L->next;
while(p)
{
visit(p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(L);
InsertList(L, 1, 1);
InsertList(L, 1, 2);
InsertList(L, 1, 3);
InsertList(L, 1, 4);
InsertList(L, 1, 5);
ListTraverse(L, print);
printf("length = %d\n", ListLength(L));
printf("Locate(4): %d\n", LocateElem(L, 4));
ElemType e;
if(OK == GetElem(L, 2, e))
{
printf("Get(2): %d\n", e);
}
else
{
printf("error!\n");
}
if(OK == DeleteList(L, 4, e))
{
printf("delete: %d\n", e);
}
else
{
printf("delete fail\n");
}
ListTraverse(L, print);
printf("length = %d\n", ListLength(L));
ClearList(L);
ListTraverse(L, print);
DestroyList(L);
return 0;
}
C语言线性非循环单链表
最新推荐文章于 2021-05-23 00:51:51 发布