链表的基本操作和代码演示:
C++环境(目的是为了使用&引用);
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK -2
typedef int Status;//用Status来替代int
//创建链表结点
typedef struct Lnode {
int date;//结点数值域
struct Lnode* next;
}Lnode;
typedef Lnode* LinkList;//LinkList指向结构体Lnode指针类型
void InitList(LinkList& L) {
//链表初始化
L = (LinkList)malloc(sizeof(Lnode));//生成新节点作为头节点,用L指向头节点
L->next = NULL;
L->date = NULL;//建立一个空表
}
//尾插法
//创建一个只有头节点的空链表
//尾指针r初始化指向头结点
//生成新节点p
//输入指针域
//新节点p插入到尾结点r后
//尾指针指向新的尾结点p
void CreateList(LinkList& L, int n) {
//正位序输入 n 个元素的值,
//建立带表头结点的单链表 L,即尾插法;
L = (LinkList)malloc(sizeof(Lnode));
L->next = NULL;
LinkList p;//生成新节点p
LinkList r = L;//尾指针r初始化指向头结点
for (int i = 1;i <= n;i++) {
p = (LinkList)malloc(sizeof(Lnode));
printf("请输入第%d元素\n",i);
scanf("%d", &(p->date));//输入date域
p->next = NULL;
r->next = p;//插入到表尾
r = p;//r指向新结点
}
}
//查找
Status GetElem(LinkList L, int i, int& e) {
//获得第i个数据
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
return ERROR;
}
e = p->date;
return e;
}
Status ListInsert(LinkList& L, int i, int e) {
//在第i个位置插入元素e
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) {
return ERROR;
}
LinkList q= (LinkList)malloc(sizeof(Lnode));//创建一个结点
q->date = e;//数字域
q->next = p->next;
p->next = q;//将节点p的指针域指向q
return OK;
}
Status ListDelete(LinkList& L, int i, int& e) {
//删除第i个位置元素并赋值给e
LinkList q;
LinkList p = L;
int j = 0;
while (p->next && j < i - 1){
p = p->next;
++j;
}
if (!(p->next) || j > i - 1){
return ERROR;
}
q = p->next;//临时保存被删结点地址
p->next = q->next;//改变删除结点前驱指针域
e = q->date;
free(q);
return OK;
}
Status ListPrint(LinkList L) {
//打印链表(额外增加功能)
LinkList p = L->next;
if(!L->next){
printf("该链表为空\n");
return ERROR;
}
while (p) {
printf("%d\n", p->date);
p = p->next;
}
return OK;
}
Status OperateMenu() {
printf("0.退出;1.插入;2.得到元素;3.删除;4.打印; 5:建立空表,6:打印长度,7:得到位置\n");
return OK;
}
void ListLength(LinkList L) {
//打印长度
LinkList p = L->next;
int i = 0;
if (!L->next) {
printf("该链表为空\n");
}
while (p) {
i++;
p = p->next;
}
printf("链表的长度为:%d\n", i);
}
void LocatElem(LinkList L,int e) {
//得到元素e的位置
LinkList p = L->next;
int i = 0;
int j = 0;
if (!L->next) {
printf("该链表为空\n");
}
while (p) {
i++;
if (e == p->date) {
printf("该元素的位置在:%d\n", i);
j = 1;
}
p = p->next;
}
if (j == 0) {
printf("链表无该元素\n");
}
}
void main(){
LinkList L;
L = NULL;
InitList(L);
printf("请输入初始化链表\n");
int n;
scanf("%d", &n);
CreateList(L,n);
int a=OperateMenu();
int e;
while (1) {
scanf("%d", &a);
switch (a) {
case 0:return ;
case 1:
printf("请输入在第x位置插入y\n");
int x, y;
scanf("%d %d", &x, &y);
e = ListInsert(L, x, y);//x位置插入y;
OperateMenu();
break;
case 2:
printf("请输入要第几个位置元素\n");
int s;
scanf("%d", &s);
e = GetElem(L, s, e);
printf("%d\n", e);
OperateMenu();
break;
case 3: printf("请输入要删除第几个元素\n");
int r;
scanf("%d", &r);
e = ListDelete(L, r, e);
OperateMenu();
break;
case 4: ListPrint(L);
OperateMenu();
break;
case 5:
InitList(L);
OperateMenu();
case 6:
ListLength(L);
OperateMenu();
break;
case 7:
printf("请输入要查找的元素:");
scanf("%d", &e);
LocatElem(L, e);
OperateMenu();
break;
}
}
}