#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType date;
struct Node* next;
}Node;
typedef struct Node *LinkList; //定义LinkList类型为结构体类型
//单链表的整表创建(头插法)
void CreateLinkListT(LinkList *L,int n)
{
int i=0;
LinkList p;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
while (i<n)
{
p = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个结点的数据:",i+1);
scanf("%d",&p->date);
i++;
p->next = (*L)->next;
(*L)->next = p;
}
}
//单链表的整表创建(尾插法)
void CreateLinkListW(LinkList* L, int n)
{
LinkList p, r;
int i;
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个结点的数据:", i + 1);
scanf("%d", &p->date);
r->next = p;
r = p;
}
r->next = NULL;
}
//单链表的打印
void print(LinkList* L,int len)
{
int i;
LinkList p;
p = *L;
printf("此时的单链表数据为:");
for (i = 0; i < len; i++)
{
p = p->next;
printf("%d ",p->date);
}
}
//单链表的长度
int GetLinkListLength(LinkList* L)
{
int k=0;
LinkList List;
List = (*L)->next;
while (List!=NULL)
{
k++;
List = List->next;
}
return k;
}
//单链表的读取(获得链表的第i个数据)
Status GetList(LinkList L, int i, ElemType* e)
{
int j;
LinkList p; //声明一个结点p
j = 1; //计数器
p = L->next; //让p指向链表的第一个结点
while (p && j < i)
{
p = p->next;
j++;
}
if (!p||j>i)
return ERROR;
else
*e = p->date; //查找成功,返回结点p的数据
return OK;
}
//单链表的插入(在第i个结点处插入值为e的数据)
Status ListInsert(LinkList* L, int i, ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p && j > i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->date=e; //将值赋给s->date
s->next = p->next;
p->next = s;
return OK;
}
//单链表的删除(删除第i个结点的数据,并用e返回其值)
Status ListDelete(LinkList* L, int i, ElemType* e)
{
int j;
LinkList p, q;
p = *L;
j = 1;
while (p->next && j < i)
{
p = p->next;
j++;
}
if (!(p->next) && j > i)
{
return ERROR;
}
else
q = p->next;
p->next = q->next;
*e = q->date;
free(q);
return OK;
}
//单链表的整表删除
Status ClearList(LinkList* L)
{
LinkList p, q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return OK;
}
//判断链表是否为空
Status IsEmpty(LinkList* L)
{
LinkList p;
p = (*L)->next;
if (p == NULL)
return OK;
else
return ERROR;
}
int main()
{
LinkList* L;
//ElemType* e;
int value;
int LinkListLength;
int len;
int LocationGet, GetValue;
printf("请输入链表长度:");
scanf("%d",&len);
L = (LinkList*)malloc(sizeof(Node));
CreateLinkListW(L, len);
print(L, len);
printf("\n\n____________________________________________\n\n");
printf("请输入需要获取的数据位置:");
scanf("%d", &LocationGet);
if (GetList(*L, LocationGet, &GetValue))
printf("第%d个结点的数据是:%d",LocationGet,GetValue);
printf("\n\n____________________________________________\n\n");
printf("请输入要插入的结点位置:");
scanf("%d", &LocationGet);
printf("请输入要插入的结点数据:");
scanf("%d", &value);
ListInsert(L, LocationGet, value);
LinkListLength = GetLinkListLength(L);
print(L, LinkListLength);
printf("\n\n____________________________________________\n\n");
printf("请输入要删除的结点位置:");
scanf("%d", &LocationGet);
ListDelete(L, LocationGet, &GetValue);
LinkListLength = GetLinkListLength(L);
print(L, LinkListLength);
printf("\n\n____________________________________________\n\n");
printf("执行单链表的全部清空函数!");
ClearList(L);
if (IsEmpty(L))
printf("单链表已清空!");
return OK;
}
C语言数据结构单链表的创建、删除、插入、读取等操作的实现
最新推荐文章于 2022-04-30 00:37:37 发布
本文详细介绍了单链表的各种基本操作,包括创建、插入、删除、读取等,并提供了完整的C语言实现代码。通过实例演示了如何使用这些操作来管理和操作链表数据。
4461





