本文实现的是带头结点的链表
目录
一、链表的定义
typedef struct node {
ElemType data;
struct node* next;
}LNode, *LinkList;
二、基本操作实现
#define DataType int
typedef struct node {
DataType data;
struct node* next;
}LNodeList, *LinkList;
//创建单链表
LinkList Creat_LinkList() {
LinkList L = (LinkList)malloc(sizeof(LNodeList));
if (L) {
L->next = NULL;
printf("创建成功\n");
}
else {
printf("创建失败\n");
}
return L;
}
//销毁单链表
void Destory_LinkList(LinkList* L) {
LinkList p, q;
p = *L;
while (p) {
q = p;
p = p->next;
free(q);
q = NULL;
}
*L = NULL;
printf("销毁成功\n");
}
//求表长
int Length_LinkList(LinkList L) {
LinkList p = L->next;
int i = 0;
if (!L)
return 0;
while (p) {
i++;
}
return i;
}
//按位查找
LinkList Locate_LinkList_Pos(LinkList L, int i) {
LinkList p = L;
int j = 0;
for (j = 0; j < i; j++) {
p = p->next;
}
return p;
}
//按值查找
LinkList Locate_LinkList_Value(LinkList L, DataType x) {
LinkList p = L->next;
while (p) {
if (p->data == x)
return p;
p = p->next;
}
return NULL;
}
//插入操作:在第i个位置插入值为x的元素
int Insert_LinkList(LinkList L, int i, DataType x) {
LinkList tmp, q, p = L;
q = (LinkList)malloc(sizeof(LNodeList));
if (!q) {
return 0; //插入失败
}
q->data = x;
int j = 0;
//找到第i-1个元素的指针
for (j = 1; j < i; j++) {
p = p->next;
}
tmp = p->next;
p->next = q;
q->next = tmp;
return 1; //插入成功
}
//删除操作:删除第i个元素
int Del_LinkList(LinkList L, int i) {
int j = 0;
LinkList tmp, p = L;
//找到第i-1个结点的位置
for (j = 1; j < i; j++) {
p = p->next;
}
tmp = p->next;
p->next = tmp->next;
free(tmp);
tmp = NULL;
return 1; //删除成功
}
//输出链表所有结点的值
void Show_LinkList(LinkList L) {
LinkList p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
}
三、测试代码
int main() {
LinkList L = Creat_LinkList();
for (int i = 0; i < 10; i++) {
if (Insert_LinkList(L, i + 1, i + 1))
printf("插入 %d 成功\n", i + 1);
}
printf("\n链表元素:\n");
Show_LinkList(L);
printf("\n");
printf("第5个元素的值为:%d\n", (Locate_LinkList_Pos(L, 5))->data);
printf("\n");
printf("第5个元素的值为:%d\n", (Locate_LinkList_Value(L, 5))->data);
printf("\n");
if (Del_LinkList(L, 5))
printf("删除成功\n");
printf("\n");
printf("\n链表元素:\n");
Show_LinkList(L);
printf("\n");
Destory_LinkList(&L);
return 0;
}