单链表的创建:头插法
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
LinkList CreateListByHead(LinkList L){
LNode *s;
int x;
L=(LinkList) malloc(sizeof (LNode));
L->next=NULL;
scanf("&d",&x);
while (x !=999){
s = (LinkList) malloc(sizeof(LNode));
s->data=x;
s->next = L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
int main()
{
LinkList L;
CreateListByHead(L);
return 0;
}

单链表的创建:尾插法
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
LinkList CreateListByTail(LinkList L){
LNode *s;
int x;
L=(LinkList) malloc(sizeof (LNode));
L->next=NULL;
LNode *r=L;
scanf("&d",&x);
while (x !=999){
s = (LinkList) malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
int main()
{
LinkList L;
CreateListByTail(L);
return 0;
}

单链表的查找
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
单链表的插入节点
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
int length(LinkList L) {
int len = 0;
LNode *p = L->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
void insertNode(LinkList L, int i, ElemType x) {
if (i < 1 || i > length(L) + 1) {
printf("无效的位置\n");
return;
}
LNode *s = (LinkList) malloc(sizeof(LNode));
s->data = x;
LNode *p = getElemByPos(L, i - 1);
s->next = p->next;
p->next = s;
}
int main() {
LinkList L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
insertNode(L, 1, 10);
insertNode(L, 2, 20);
insertNode(L, 1, 5);
LNode *p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
p = L;
while (p != NULL) {
LNode *temp = p;
p = p->next;
free(temp);
}
return 0;
}
单链表的删除节点
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
int length(LinkList L) {
int len = 0;
LNode *p = L->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
bool deleteNode(LinkList L, int i, ElemType *e) {
if (i < 1 || i > length(L)) {
return false;
}
LNode *p;
LNode *q;
p = getElemByPos(L, i - 1);
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return true;
}
void insertNode(LinkList L, int i, ElemType x) {
if (i < 1 || i > length(L) + 1) {
printf("无效的位置\n");
return;
}
LNode *s = (LinkList) malloc(sizeof(LNode));
s->data = x;
LNode *p = getElemByPos(L, i - 1);
s->next = p->next;
p->next = s;
}
int main() {
LinkList L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
insertNode(L, 1, 10);
insertNode(L, 2, 20);
insertNode(L, 1, 5);
LNode *p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
ElemType e;
if (deleteNode(L, 2, &e)) {
printf("已删除节点的值: %d\n", e);
} else {
printf("删除失败\n");
}
p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
p = L;
while (p != NULL) {
LNode *temp = p;
p = p->next;
free(temp);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!