#define _CRT_SECURE_NO_WARNINGS//必须要放在第一行
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//单链表结点的定义
typedef struct LNode { //单链表结点类型
ElemType data; //数据域
struct LNode* next; //指针域
}LNode,*LinkList;
//头插法新建链表
LinkList CreatList1(LinkList& L) { //list_heatd_insert
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode)); //带头结点的链表
L->next = NULL; //L->data里边没放东西
scanf("%d", &x); //从标准输入读取数据
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode)); //申请一个新空间给s,强制类型转换
s->data = x;
s->next = L->next; //让新结点的next指针指向链表的第一个元素
L->next = s;
scanf("%d", &x); //标准输入读取
}
return L; //可以不写
}
//尾插法新建链表
LinkList CreatList2(LinkList& L) { //list_tail_insert
int x;
L = (LinkList)malloc(sizeof(LNode)); //带头结点的链表
LNode* s, * r = L; //LinkList s,r=L;
scanf("%d", &x);
while (x != 9999) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s; //让尾部结点指向新结点
r = s; //r指向新的表尾结点
scanf("%d", &x);
}
r->next = NULL; //尾指针的next指针赋值为NULL
return L; //可以不写
}
//按序号查找节点值
LNode* GetElem(LinkList L, int i) {
int j = 1;
LNode* p = L->next; //让p指向第一个结点
if (i == 0)
return L; //i是零就返回头结点
if (i < 1)
return NULL; //i是负值就返回空
while (p && j < i) {
p = p->next; //让p指向下一结点
j++;
}
return p;
}
//按值查找
LNode* LocateElem(LinkList L, ElemType e) {
LNode* p = L->next;
while (p != NULL && p->data != e) //p && p->data != e
p = p->next;
return p;
}
//新结点插入第i个位置
bool ListFrontInsert(LinkList L, int i, ElemType e) {
LinkList p = GetElem(L, i - 1); //拿到要插入位置的前一个位置的地址值
if (NULL == p) {
return false;
}
LinkList s = (LNode*)malloc(sizeof(LNode)); //为新插入的结点申请空间
s->data = e; //要插入的值放入对应空间
s->next = p->next; //插入步骤
p->next = s;
return true;
}
//删除第i个结点
bool ListDelete(LinkList L, int i) {
LinkList p = GetElem(L, i - 1);
if (NULL == p) {
return false; //要删除的位置不存在
}
LinkList q;
q = p->next;
p->next = q->next; //断连
free(q); //释放对应结点的空间
return true;
}
//打印输出链表
void PrintList(LinkList L) {
L = L->next;
while (L != NULL) {
printf("%3d",L->data); //打印当前结点数据
L = L->next; //指向下一个结点
}
printf("\n");
}
int main() {
LinkList L; //链表头,是结构体指针类型
LinkList search; //用来存储拿到的某一个结点
CreatList1(L); //输入数据可以为3 4 5 6 7 9999(头插)
//CreatList2(L); //输入数据可以为3 4 5 6 7 9999(尾插)
PrintList(L); //链表打印
search = GetElem(L, 2); //按位序查询
if (search != NULL) {
printf("按序号查找成功\n");
printf("%d\n", search->data);
}
search = LocateElem(L, 6); //按值查询
if (search != NULL) {
printf("按值查找成功\n");
printf("%d\n", search->data);
}
ListFrontInsert(L, 2, 99); //新结点插入第i个位置
PrintList(L);
ListDelete(L, 4); //删除第四个结点
PrintList(L);
return 0;
}
单链表的实现
于 2022-04-27 15:38:53 首次发布

1568

被折叠的 条评论
为什么被折叠?



