此单链表的功能有 判断是否为空表、清空单链表、销毁单链表、插入数据、删除数据、查找单链表中的数据。
以下是代码段
//单链表
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define OK 1
#define ERROR 0
#define OVERLOW 0
typedef int Status;
typedef struct {
int number[80];
}ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
Status length;
}LNode, * LinkList;
//初始化链表
Status InitList_L(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return OK;
}
//判断链表是否为空表
int ListElempty_L(LinkList L) {
if (L->next == NULL) {
printf("此表是空表\n");
return OK;
}
else {
printf("此表不是空表\n");
return 0;
}
}
//销毁链表
Status DestroyList_L(LinkList& L) {
//创建一个链表p
LinkList p;
//当L不为空的时候执行下面步骤
while (L) {
//L赋给p,依次释放掉
p = L;
L = L->next;
free(p);
}
printf("销毁单链表操作成功!\n");
return OK;
}
//清空链表
Status ClearList_L(LinkList& L) {
LinkList p;
LinkList q;
p = L->next;
while (p) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
printf("清空单链表操作成功!\n");
return OK;
}
//求链表的长度
Status ListLength(LinkList L) {
int number = 0;
LinkList p;
p = L->next;
while (p) {
p = p->next;
number++;
}
printf("此链表的长度是%d\n", number);
return OK;
}
//得到链表中的一个元素
Status GetElem_L(LinkList& L, int i, ElemType& e) {
LinkList p;
p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p|| j > i) {
printf("此链表为空表,取不到链表中元素\n");
return ERROR;
}
e = p->data;
printf("取得链表的元素是%d\n", e);
return OK;
}
//删除链表中的一个元素
Status ListDelete(LinkList& L, int i, ElemType& e) {
LinkList p;
LinkList q;
p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
return ERROR;
}
q = p->next;
e = q->data;
p->next = q->next;
free(q);
return OK;
}
//插入元素
Status ListInsert_L(LinkList& L, int i, ElemType e) {
LinkList p;
LinkList q;
p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
return ERROR;
}
q = (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
//链表头插法
Status CreateListHead_L(LinkList& L, int i) {
L = (LinkList)malloc(sizeof(LNode));
LinkList p;
L->next = NULL;
for (int n = i; n > 0; n--) {
p = (LinkList)malloc(sizeof(LNode));
printf("请输入要插入的数:\n");
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
return OK;
}
//链表尾插法
Status CreateListTail_L(LinkList& L, int i) {
L = (LinkList)malloc(sizeof(LNode));
LinkList r;
LinkList p;
L->next = NULL;
r = L;
for (int n = i; n > 0; n--) {
p = (LinkList)malloc(sizeof(LNode));
printf("请输入要插入的数:\n");
scanf("%d", &p->data);
r->next = p;
r = p;
}
r->next = NULL;
return OK;
}
//输出单链表中的值
Status printData_L(LinkList& L) {
LinkList p;
p = L->next;
while (p) {
printf("%5d", p->data);
p = p->next;
}
printf("\n");
return OK;
}
int main() {
LinkList L;
InitList_L(L);
while (true) {
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(" 9.退出单链表操作\n");
printf("***************************************************\n");
int operateNumber;
printf("请输入要操作的数字:\n");
scanf("%d", &operateNumber);
switch (operateNumber) {
case 1:
ListElempty_L(L);
break;
case 2:
//尾插法插入元素
int number;
printf("请输入要插入几个元素:\n");
scanf("%d", &number);
CreateListTail_L(L, number);
//输出元素
printData_L(L);
break;
case 3:
//求单链表的长度
ListLength(L);
break;
case 4:
//清空单链表
ClearList_L(L);
break;
case 5:
//销毁单链表
DestroyList_L(L);
break;
case 6:
//在链表中指定一个位置插入元素
int pos;
printf("请输入插入的位置:\n");
scanf("%d", &pos);
ElemType num;
printf("请输入插入的元素:\n");
scanf("%d", &num);
ListInsert_L(L, pos, num);
//输出元素
printData_L(L);
break;
case 7:
//在链表中指定一个位置删除元素
ElemType ee;
int deletePosition;
printf("请输入删除的位置:\n");
scanf("%d", &deletePosition);
ListDelete(L, deletePosition, ee);
printData_L(L);
break;
case 8:
//得到链表中的一个元素
int position;
printf("请输入想要得到链表中第几个位置的元素:\n");
scanf("%d", &position);
ElemType getData;
GetElem_L( L, position, getData);
break;
case 9:
printf("你已经退出单链表操作了");
exit(0);
break;
default:
printf("你输出的数字有误请重新输入:\n");
break;
}
}
system("pause");
return 0;
}
下面是功能演示: