1、数据结构-单链表的实现-C语言
typedef struct LNode
{
int data;
struct LNode* next;
} LNode,*LinkList; //这两者等价。LinkList这样方便理解
void Show_Help();
//初始化线性表
void InitList(LinkList *L);
//销毁线性表
void DestroyList(LinkList *L);
//清空线性表
void ClearList(LinkList *L);
//线性表是否为空
int ListEmpty(LinkList *L);
//线性表长度
int ListLength(LinkList *L);
//线性表查找
void GetElem(LinkList L,int i);
//返回相同元素的位置
void LocateElem(LinkList L,int e);
//求前驱
void PriorElem(LinkList L,int previous);
//求后继
void NextElem(LinkList L,int next);
//插入元素
void ListInsert(LinkList *L,int key,int value);
//删除元素
void ListDelete(LinkList *L,int key);
//显示线性表中元素
void TraverList(LinkList L);
//线性表翻转
//--------------------------------------------------------------------
void Show_Help()
{
printf("1---初始化单链表\n");
printf("2---销毁单链表\n");
printf("3---置空单链表\n");
printf("4---判断单链表是否为空\n");
printf("5---求单链表长度\n");
printf("6---获取单链表某位置元素\n");
printf("7---请输入元素的值,判断其在单链表中是否存在,并返回其下标,不存在则返回0\n");
printf("8---求直接前驱\n");
printf("9---求直接后继\n");
printf("10---插入元素\n");
printf("11---删除元素\n");
printf("12---显示单链表全部元素\n");
printf("13---翻转单链表全部元素\n");
printf("14---演示单链表的并操作\n");
printf("退出,输入一个负数\n");
}
void InitList(LinkList *L)
{
*L = (LNode*) malloc(sizeof(LNode)); //生成头结点,并用L指针指向头结点
if(!(*L)){
printf("分配失败\n");
return ;
}
(*L)->next = NULL;
}
void DestroyList(LinkList *L)
{
//销毁时要从头到尾都删除
LinkList cut;
while(*L){
cut = *L;
*L = (*L)->next;
free(cut);
}
}
void ClearList(LinkList *L)
{
//把除了头结点的其他全删除
LinkList cut=(*L)->next;
LinkList middle;
while(cut){
middle = cut->next;
free(cut);
cut = middle;
}
}
int ListEmpty(LinkList *L)
{
if((*L)->next == NULL)
return 1;
else
return 0;
}
int ListLength(LinkList *L)
{
int num = 0;
LNode* middle = (*L);
while(middle->next){
num++;
middle = middle->next;
}
return num;
}
void GetElem(LinkList L,int i)
{
LinkList middle = L->next;
int key = 1;
int value;
while(middle && key<i){
middle = middle->next;
key++;
}
if(key>i || middle==NULL){
printf("输入范围有误,请重新选择。\n");
return;
}
value = middle->data;
printf("位于第%d个位置的值为:%d\n",i,value);
}
void LocateElem(LinkList L,int value)
{
LinkList middle = L->next;
int key = 0;
int num = 1;
while(middle){
middle = middle->next;
num++;
if(middle->data == value){
key = num;
break;
}
}
if(key)
printf("%d在单链表中下标为%d\n",value,key);
else
printf("%d在单链表中不存在\n",value);
}
void PriorElem(LinkList L,int previous)
{
if(previous == 1){
printf("第一个元素没有前驱,请重新选择。\n");
return;
}
LinkList middle = L->next;
int num = 1;
int value;
while(num<(previous-1) && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>(previous-1)){
printf("输入范围有误,请重新选择。\n");
return;
}
value = middle->data;
printf("第%d个位置的前驱为:%d\n",previous,value);
}
void NextElem(LinkList L,int next)
{
LinkList middle = L->next;
int num = 1;
int value;
while(num<(next+1) && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>(next+1)){
printf("输入范围有误,请重新选择。\n");
return;
}
if(num == next){
printf("最后一个元素没有后继,请重新选择。\n");
return;
}
value = middle->data;
printf("第%d个位置的后继为:%d\n",next,value);
}
void ListInsert(LinkList *L,int key,int value)
{
LinkList middle = (*L);
int num = 0;
while(num<key-1 && middle){
num++;
middle = middle->next;
}
if(middle==NULL || num>key-1){
printf("输入范围有误,请重新选择。\n");
return;
}
LinkList insert;
insert = (LNode*) malloc(sizeof(LNode)); //给要插入的结点分配空间
insert->next = middle->next;
insert->data = value;
middle->next = insert;
}
void ListDelete(LinkList *L,int key)
{
LinkList cut = (*L)->next;
int num = 1;
while(num<key && cut){
num++;
cut = cut->next;
}
if(!cut || num>=key){
printf("输入范围有误,请重新选择。\n");
return;
}
LinkList middle = cut->next;
cut->next = middle->next;
free(middle);
}
void TraverList(LinkList L)
{
printf("单链表所有元素有:");
int num = 1;
LinkList value = L->next;
while(value){
printf("%d ",value->data);
value = value->next;
}
printf("\n");
}
void Filp(LinkList* L)
{
LinkList q = (*L)->next;
LinkList p = q->next;
while(p){
q->next = p->next;
p->next = (*L)->next;
(*L)->next = p;
p = q->next;
}
printf("翻转成功\n");
}