#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef int Status;
//存储结构
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
//头结点
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(struct LNode));
if (!(*L))
{
return 0;
}
(*L)->next = NULL;
return 1;
}
//取值
Status GetElem(LinkList L, int i, ElemType *e)
{
LinkList p = L->next;
int j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i)
return 0;
*e = p->data;
return 1;
}
//查找
LNode *LocateElem(LinkList L, ElemType e)
{
LinkList p = L->next;
while (p && p->data != e)
{
p = p->next;
}
return p;
}
//插入
Status ListInsert(LinkList L, int i, ElemType e)
{
LinkList p = L;
int j = 0;
while (p && (j < i - 1))
{
p = p->next;
j++;
}
if (!p || j > i - 1)
return 0;
LinkList s = (LinkList)malloc(sizeof(struct LNode));
if (!s)
{
return 0;
}
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
//删除
Status ListDelete(LinkList L, int i)
{
LinkList p = L;
int j = 0;
while ((p->next) && (j < i - 1))
{
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))
return 0;
LinkList q = p->next;
p->next = q->next;
free(q);
return 1;
}
//头插法
void CreateList_H(LinkList *L, int n)
{
*L = (LinkList)malloc(sizeof(struct LNode));
(*L)->next = NULL;
for (int i = 0; i < n; i++)
{
LinkList p = (LinkList)malloc(sizeof(struct LNode));
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
//尾插法
void CreateList_R(LinkList *L, int n)
{
*L = (LinkList)malloc(sizeof(struct LNode));
(*L)->next = NULL;
LinkList r = *L;
for (int i = 0; i < n; i++)
{
LinkList p = (LinkList)malloc(sizeof(struct LNode));
scanf("%d", &p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
int main()
{
LinkList L;
InitList(&L);
// 测试链表操作
printf("请输入链表节点个数:");
int n;
scanf("%d", &n);
printf("请按顺序输入 %d 个整数作为链表元素:\n", n);
CreateList_R(&L, n);
printf("链表中的元素为:\n");
LinkList p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
// 测试取值
ElemType e;
int pos;
printf("请输入要获取元素的位置:");
scanf("%d", &pos);
if (GetElem(L, pos, &e))
{
printf("第 %d 个元素为:%d\n", pos, e);
}
else
{
printf("获取失败,位置不合法!\n");
}
// 测试查找
ElemType target;
printf("请输入要查找的元素:");
scanf("%d", &target);
LinkList targetNode = LocateElem(L, target);
if (targetNode)
{
printf("找到元素 %d\n", target);
}
else
{
printf("未找到元素 %d\n", target);
}
// 测试插入
ElemType insertData;
int insertPos;
printf("请输入要插入的元素和位置:");
scanf("%d %d", &insertData, &insertPos);
if (ListInsert(L, insertPos, insertData))
{
printf("插入成功!\n");
}
else
{
printf("插入失败,位置不合法!\n");
}
// 测试删除
int delPos;
printf("请输入要删除的位置:");
scanf("%d", &delPos);
if (ListDelete(L, delPos))
{
printf("删除成功!\n");
}
else
{
printf("删除失败,位置不合法!\n");
}
// 输出修改后的链表
printf("修改后的链表元素为:\n");
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
// 释放链表内存
p = L;
while (p)
{
LinkList temp = p;
p = p->next;
free(temp);
}
return 0;
}
数据结构链表的基本操作代码实现(c语言)
最新推荐文章于 2024-04-12 03:54:59 发布