#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define OVERFLLOW -99
typedef int ElemType;
/*链式存储结构*/
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList; //相当于typedef struct Node *LinkList;定义一个线性表,定义的是Node结构体的指针
/*基于链式存储的初始化操作*/
/*初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L
*L表示结构体指针的指针*/
void InitList(LinkList* L)
{
(*L) = (LinkList)malloc(sizeof(LNode));//动态分配一个头结点,并使得头指针*L指向这个头结点,并且强制类型转换
if ((*L)==NULL)
{
exit(OVERFLLOW);
}
(*L)->data = 0;
(*L)->next = NULL; //头结点的指针域为NULL
}
/*基于链式存储的插入操作(头插法)*/
void InsertList(LinkList* L,ElemType elem)
{
LinkList p;
p = (LinkList)malloc(sizeof(LNode));
if (p==NULL)
{
exit(OVERFLLOW);
}
p->data = elem;
p->next = (*L)->next;
(*L)->next = p;
}
/*基于链式存储的插入操作(尾插法)*/
void InsertListEnd(LinkList *L,ElemType elem)
{
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
if (s == NULL)
{
exit(OVERFLLOW);
}
/*找到尾结点*/
LinkList end = (*L); //用end从头指针开始找
while (end->next!=NULL)
{
end = end->next;
}
s->data = elem;
s->next = end->next;
end->next = s;
}
/*在链表的第i个位置之前插入一个元素e*/
void InsertListfirst(LinkList*L, int i, ElemType e)
{
LinkList prior,s;
prior = (*L); //p指向头结点
int j = 0;
while (j<i-1 && prior!=NULL)
{
prior = prior->next;
j++;
}
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = prior->next;
prior->next = s;
}
/*删除链表中第i个位置的元素,并用实参e保存被删除的元素的值*/
void DeleteList(LinkList*L, int i, ElemType *e)
{
LinkList move = (*L);
int j = 0;
while (j<i-1)
{
if (move->next!=NULL)
{
move = move->next;
j++;
}
else
{
printf("%d的位置元素不存在\n",i); //此时链表为空
}
}
*e = move->next->data; //用实参e保存被删除的元素的值
move->next = move->next->next; //删除操作
}
/*输出链表元素的值 求出链表的长度*/
void PrintList(LinkList L)
{
int count = 0; //用于计数
LinkList p;
p = L->next; //L为头指针指向头结点,L->next为首元结点的地址,这时p指向首元结点
while (p!=NULL)
{
count++;
printf("%d\n", p->data);
p = p->next;
}
printf("链表长度为:%d\n", count);
}
int main()
{
LinkList List1,List2;
InitList(&List1);
InitList(&List2);
/*用头插法插入5个数字*/
for (int i = 0; i < 5; i++)
{
InsertList(&List1, rand()% 20 + 1); //传入1-100的随机数
}
/*用头插法插入5个数字*/
for (int i = 0; i < 5; i++)
{
InsertList(&List2, rand() % 20 + 1); //传入1-100的随机数
}
/*输出链表*/
PrintList(List1);
printf("\n");
PrintList(List2);
printf("\n");
/*在第三个位置之前插入数据*/
InsertListfirst(&List2, 3, 0);
PrintList(List2);
/*删除第五个数据*/
ElemType reference = 0;
DeleteList(&List1,5,&reference);
PrintList(List1);
return 0;
}
单链表链式存储的初始化、插入、删除
最新推荐文章于 2023-05-05 12:07:16 发布