实现链表的初始化、创建、查找、插入、删除、计算长度算法。
数据结构中的数据元素的类型为ElemType,通过typedef或define为ElemType指定具体的数据类型。
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef int Status;
#define OVERFLOW 0
#define ERROR 0
#define OK 1
//author: 小柳学渣
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
/*查找*/
Status GetElem_L(LinkList &L, int i, ElemType &e)
{
LNode *p;
int j;
p = L->next;
j = 1;
while (p&&j < i)
{
p = p->next;
++j;
}
if (!p||j > i)
{
printf("i值不合法");
return ERROR;
}
e = p->data;
printf("元素为:%d", e);
return OK;
}
/*插入*/
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
LNode *p, *s;
int j;
p = L;
j = 0;
while (p&&j < i - 1)
{
p = p->next;
++j;
}
if (!p||j > i - 1)
{
printf("i值不合法");
return ERROR;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("插入成功");
return OK;
}
/*删除*/
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
LNode *p, *q;
int j;
p = L;
j = 0;
while (p->next&&j < i - 1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
{
printf("i值不合法");
return ERROR;
}
q = p->next;
p->next = q->next;
e = q->data;
free(q);
printf("删除成功");
return OK;
}
/*创建*/
void CreateList_L(LinkList &L, int n)
{
LNode *p;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for (i = n; i > 0; --i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &p->data);
p->next = L->next;
L->next = p;
}
}
/*重置*/
void ClearList_L(LinkList &L)
{
LNode *p;
while (L->next)
{
p = L->next;
L->next = p->next;
free(p);
}
}
/*遍历*/
void ListTraverse(LinkList &L)
{
LNode *p;
p = L->next;
while (p != NULL)
{
printf("%d\t", p->data);
p = p->next;
}
}
/*检查是否为空*/
void ListEmpty(LinkList &L)
{
if (L->next == NULL)
printf("链表为空\n");
else
printf("链表不为空\n");
}
/*初始化单链表*/
LinkList LinkListInit()
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("初始化单链表成功\n");
return L;//返回该单链表
}
/*长度*/
int LinkListLength(LinkList &L)
{
LinkList p;
int j;
p = L->next;
j = 0;
while (p != NULL)
{
j++;
p = p->next;
}
return j;
}
//author: 小柳学渣
int main()
{
LinkList a;
printf("************************************************\n");
printf("*链表操作 *\n");
printf("************************************************\n");
printf("*请选择 *\n");
printf("*1、创建链表 *\n");
printf("*2、遍历链表 *\n");
printf("*3、从链表中查找元素 *\n");
printf("*4、从链表中插入元素 *\n");
printf("*5、从链表中删除元素 *\n");
printf("*6、检查链表是否为空 *\n");
printf("*7、初始化链表 *\n");
printf("*8、求链表长度 *\n");
printf("*0、退出系统 *\n");
printf("************************************************\n");
int n = 0, k = 0, e, i;
while (1)
{
printf("\n\n请输入选项");
scanf_s("%d", &n);
switch (n)
{
case 1:printf("请输入要添加元素的个数:");
scanf_s("%d", &k);
printf("请输入%d个数(反序):\n", k);
CreateList_L(a, k);
break;
case 2:ListTraverse(a);break;
case 3:printf("请输入要查找元素的位置:");
scanf_s("%d", &i);
GetElem_L(a, i, e);
break;
case 4:printf("请输入要插入元素的位置:");
scanf_s("%d", &i);
printf("请输入要插入的元素:");
scanf_s("%d", &e);
ListInsert_L(a, i, e);
break;
case 5:printf("请输入要删除元素的位置:");
scanf_s("%d", &i);
ListDelete_L(a, i, e);
break;
case 6:ListEmpty(a);break;
case 7:a = LinkListInit();break;
case 8:printf("链表的长度为:%d\n", LinkListLength(a));break;
case 0:exit(0); break;
default:printf("没有这个选项\n"); break;
}
}
}
C中的动态分配与释放函数(malloc, free)