单链表的节点类
//创建节点类
typedef struct LinkNode {
int data;
struct LinkNode *next;
}Lnode,*LinkList;
头插法
//头插法
LinkList create_head() {
int flag = 9999;
LinkList L = NULL;//定义L为空链表
Lnode* s;
int x;//设置数据元素的类型为int型
printf("请输入:");
scanf_s("%d", &x);
while (x!=flag)
{
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
s->next = L;
L = s;//将
printf("请输入:");
scanf_s("%d", &x);
}
return L;
}
尾插法
//尾插法创建线性链表
LinkList creat_end() {
LinkList L = NULL;//定义一个空链表
Lnode* s,*r=NULL;
int x;//输入的数据类型为int
printf("请输入:");
scanf_s("%d", &x);
int flag = 9999;
while (x!=flag) {
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
if (L == NULL) {//第一个节点的处理
L = s;
}
else {//其他节点的处理
r->next = s;
}
r = s;//r指向新的尾节点
printf("请输入:");
scanf_s("%d", &x);
}
if (r != NULL) {
r->next = NULL;//对于非空表,最后节点的指针域置空
}
return L;
}
求链表长度
//求单链表的表长——没有头结点
int LinkList_length_nohead(LinkList L) {
Lnode *p = L;
int j = 0;
while (p->next) {
p = p->next;
j++;
}
printf("长度为%d", j);
return j;
}
//求单链表的表长——有头结点
int LinkLIst_length_head(LinkList L) {
Lnode* p = L;
int j = 0;
while (p) {
j++;
p = p->next;
}
printf("长度为%d", j);
return j;
}
按照索引和按照值查找元素
//在单链表中按照下标查找
Lnode* Get_LinkList(LinkList L, int index) {
//在单链表L中查找第i个元素节点,找到返回其指针否则为空
Lnode* p = L;
int j = 0;
while (p->next != NULL && j < index) {
p = p->next;
j++;
}
if (j == index) {
return p;
}
else
{
return NULL;
}
}
//在单链表中按照数值查找
Lnode* findBYValue(LinkList L, int value) {
Lnode* p = L->next;
while (p != NULL && p->data != value) {
p = p->next;
}
return p;
}
按照索引插入
//按照地址下标插入
int insert_LinkLIst(LinkList L, int value, int index) {
//在单链表L上的第index个位置插入值为value的元素
Lnode* p, * s;
p = Get_LinkList(L, index - 1);//调用Get_LinkList函数找到第index-1个节点
if (p == NULL) {
printf("参数index错误");
return 0;
}
else {
s = (Lnode*)malloc(sizeof(Lnode));//申请填装节点
s->data = value;
s->next = p->next;//新节点插入在第index-1个节点的后边
p->next = s;
return 1;
}
}
按照下标删除
//单链表的删除——按照下标删除
int delete_LinkList(LinkList L, int index) {
//删除单链表L上的第i个数据节点
LinkList p, s;
p = Get_LinkList(L, index - 1);
if (p = NULL) {
printf("节点index-1不存在");//先查找到第index-1个节点
return 0;
}
else if (p->next == NULL) {
printf("节点index不存在");
return 0;
}
else {
s = p->next;//s指向第index个节点
p->next = s->next;//丛链表中删除
free(s);//释放s
return 1;
}
}