头文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -2
#define TRUE 1
#define FLASE 0
#define ERROR 0
typedef int ElemType;
typedef int Status;
源文件
#include"c1.h"
typedef struct LNode {
ElemType data;
struct LNode* next;
}*LinkList;
//带头节点的链表的插入 删除操作的实现
Status InitList(LinkList& L) { //ps: LinkList &L === LNode* &L,指针的引用:不仅可以访问L指向的区域,还可以改变L的值。而如果换成LinkList L or LNode * L,指针:只可以访问L指向的区域并改变L指向的区域,但不能改变L的值
L = (LNode*)malloc(sizeof(LNode)); //产生头结点,并使L指向此头结点 (指针的引用发挥作用,改变L的值)
if (!L)
exit(OVERFLOW);
L->next = NULL; //指针域为空
return OK;
}
Status ListEmpty(LinkList L) {
if (L->next)
return TRUE;
else
return FLASE;
}
int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; //p指向首元结点
while (p) {
i++;
p = p->next;
}
return i;
}
Status ListInsert(LinkList L, int i, ElemType e) {
//在带头结点的单链表L中第i个位置前插入e
int j = 0;
LinkList p = L, s;
while (p && j < i - 1) {//找到第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1)
return ERROR;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete(LinkList L, int i, ElemType e) {
// 删除第i个结点,并用e返回其值
int j = 0;
LinkList p = L,q;
while (p->next && j < i - 1) { //寻找第i个结点,用p指向他
p = p->next;
j++;
}
if (!p->next || j > i - 1)
return ERROR;
q = p->next;
e = q->data;
p->next = q->next;
free(q); //释放被删结点
return e;
}
void ListPrint(LinkList L) {
LinkList p = L->next;
while (p) {
printf("%d", p->data);
printf(" ");
p = p->next;
}
}
int main() {
LinkList L;
InitList(L);
ElemType e;
printf("请输入将在链表中插入的10个结点\n");
for (int i = 1; i <= 10; i++) {
scanf_s("%d", &e);
ListInsert(L, i, e);
}
printf("打印输出链表所有结点\n");
ListPrint(L);
printf("\n");
printf("删除第五个结点,并打印删除后的所有结点\n");
ListDelete(L, 5, e);
ListPrint(L);
printf("\n");
printf("在第四个结点前插入一个结点,请输入插入的结点的数据e\n");
scanf_s("%d", &e);
ListInsert(L, 4, e);
printf("打印输出链表所有结点\n");
ListPrint(L);
printf("\n");
system("pause");
return 0;
}
结果显示

本文介绍了一个简单的单链表实现,包括初始化、插入、删除等核心操作,并提供了完整的C语言代码示例。通过这些基本操作,读者可以了解单链表的工作原理及其实现细节。
1745

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



