大学生-程序元,开始记录生活
南枫在这里和大家一同进步,一同交流学习
注:代码实现用Visual Studio 2019
#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,指向这个结构体
//*LinkList 等价于 struct LNode *
//头插法新建链表
LinkList CreatList1(LinkList& L)
{
LNode* s; int x;
L = (LinkList)malloc(sizeof(LNode));//带头结点的链表
L->next = NULL;//L->data里面没放东西
scanf("%d", &x);//从标准输入读入数据
//3 4 5 6 7 9999
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//申请一个新空间,强制类型转换
s->data = x;//把读取到的值,给新空间中的数据部分
s->next = L->next;
L->next = s;
scanf("%d", &x);//读取标准输入
}
return L;
}
LinkList CreatList2(LinkList &L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
// 我们认为r是指向表尾节点的
LNode* s, * r = L;
//3 4 5 6 7 9999
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;
}
//打印链表中每个节点的数值
/*void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}*/
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%3d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
}
printf("\n");
}
LinkList GetElem(LinkList L,int i)
{
int j = 1;
LNode* p = L->next;//开始就让p指向第一个节点(不是头节点)
if (i == 0)
return L;
if (i < 1)
return NULL;
while (p && j < i) {
p = p->next;//让p指向下一个节点
j++;
}
return p;
}
LinkList LocateElem(LinkList L, ElemType e)
{
LinkList p = L->next;
while (p != NULL && 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 = p->next;
if (q == NULL)//删除的元素不存在
return false;
p->next = q->next;//断链
free(q);//释放对应节点的空间
q = NULL;//为了避免野指针
return true;
}
int main()
{
LinkList L;//链表头,是结构体指针类型,等于struct LNode* L;
LinkList search;//用来存储拿到的某一个结点
//CreatList1(L);//输入数据可以为3 4 5 6 7 9999 头插法新建链表
//PrintList(L);
CreatList2(L);//尾插法新建链表
//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;
}
如果您感觉这篇文章有帮助,希望大家可以点个赞,支持一下。
您的支持,就是我的动力。