您的位置:首页 > 理论基础 > 数据结构算法

链表的基本操作

2016-05-17 21:19 459 查看
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//链表的函数声明

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;

List CreateList();                                //创建链表
bool IsEmpty(List L);                             //检测链表是否为空
bool IsLast(Position P, List L);                  //检测是否为最后一个元素
Position Find(ElementType X, List L);             //链表元素的查找
void Delete(ElementType X, List L);               //链表元素的删除
Position FindPrevious(ElementType X, List L);     //寻找(要删结点的)前一个元素
void Insert(ElementType X, List L, Position P);   //链表元素的插入
void DeleteList(List L);                          //删除链表
Position Header(List L);                          //返回链表头结点
Position First(List L);                           //返回链表第一个元素
void printList(List L);                           //打印链表

struct Node {
ElementType Element;
Position Next;
};

int main()
{
int number, flag;
ElementType X, X2;
Position P;
List L;

flag = 1;
printf("|           链表的基本使用           |\n");
printf("|************************************|\n");
printf("|            1. 创建链表             |\n");
printf("|            2. 销毁链表             |\n");
printf("|            3. 元素的插入           |\n");
printf("|            4. 元素的删除           |\n");
printf("|            5. 元素的查找           |\n");
printf("|            6. 打印链表             |\n");
printf("|************************************|\n");

while (flag) {
printf("请选择功能 :                      \n");
scanf("%d", &number);
switch(number) {
case 1 :
L = CreateList();
break;

case 2 :
if (L) {
DeleteList(L);
} else
printf("链表不存在!!!\n");
break;

case 3 :
if (L) {
printf("请输入需要插入的元素和位置:");
printf("(如将X插到5后面则,输入X  5,第一次插入则输入 X, 0 )");
scanf("%d%d", &X, &X2);
P = Find(X2, L);
if (X2 != 0) {
while (!P) {
printf("该位置不存在!\n");
printf("请重新输入需要插入的元素和位置");
scanf("%d%d", &X, &X2);
P = Find(X2, L);
if (X2 == 0)
break;
}
}
Insert(X, L, P);
} else
printf("链表不存在!!!\n");
break;

case 4 :
if (L) {
printf("请输入需要删除的元素:");
scanf("%d", &X);
Delete(X, L);
} else
printf("链表不存在!!!\n");
break;

case 5 :
if (L) {
printf("请输入需要查找的元素:");
scanf("%d", &X);
if( Find(X, L))
printf("该元素存在!\n");
else
printf("该元素不存在!\n");
} else
printf("链表不存在!!!\n");
break;
case 6 :
if (L) {
printf("链表中元素如下:");
printList(L);
} else
printf("链表不存在!!!\n");
break;

default :
printf("程序运行结束,请按任意键退出!!!\n");
flag = 0;
}

}
}

List CreateList()                                  //创建链表
{
List L;

if (!(L = malloc(sizeof(struct Node))))
exit(-1);
L->Next = NULL;

return L;
}

void DeleteList(List L)                            //删除链表
{
Position P, TmpCell;

P = L->Next;
L->Next = NULL;
while ( P != NULL) {
TmpCell = P->Next;
free(P);
P = TmpCell;
}
}

bool IsEmpty(List L)                                //检查链表是否为空
{
return L->Next == NULL;
}

Position Find(ElementType X, List L)               //查找链表中的元素
{
Position P;

P = L->Next;
while (P != NULL && P->Element != X)
P = P->Next;

return P;
}

void Delete(ElementType X, List L)                  //删除链表中的元素
{
Position P, TmpCell;

P =  FindPrevious(X, L);
if (!IsLast(P, L)) {
TmpCell = P->Next;
P->Next = TmpCell->Next;
free(TmpCell);
}
}

Position FindPrevious(ElementType X, List L)	    //返回前一个元素位置 (配合删除链表使用)
{
Position P;

P = L;
while (P->Next != NULL && P->Next->Element != X)
P = P->Next ;

return P;
}

void Insert(ElementType X, List L, Position P)      //链表元素的插入
{
Position TmpCell;

if (!(TmpCell = malloc(sizeof(struct Node))))
exit(-1);

if (P != NULL) {
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
} else {                            //第一次插入
TmpCell->Element = X;
TmpCell->Next = L->Next;
L->Next = TmpCell;
}

}

Position Header(List L)                              //返回头结点
{
return L;
}

Position First(List L)                               //返回第一个元素
{
return L->Next;
}

bool IsLast(Position P, List L)                      //检查该元素是否为链表最后一个元素
{
return P->Next == NULL;
}

void printList(List L)                               //打印链表
{
Position P;

P = L->Next;
while (P) {
printf("%d -> ", P->Element );
P = P->Next;
}
printf("\n");
}

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