/* *******************************************************************************
用链接存储方式存储的线性表——链表,可以克服顺序表的插入与删除时间复杂度为O(n)缺点。
但其获知表长与访问元素的时间复杂度O(n)较顺序表O(1)比较变差了
比较适合频繁进行插入与删除操作,访问操作较少的情况
链表中的结点用存储单元来存放,
一个结点对应一个存储单元,存储单元之间既可以是(空间上)连续的,也可以是不连续的,
甚至可以零散分布在存储空间中的任何位置。
链表中结点的逻辑次序和物理次序未必一致。
为了能正确表示结点之间的逻辑关系,一个存储单元除了存放每个结点值data 以外,
还必须存有其后继结点的地址信息,这个信息被称为指针,记为next .
因此,一个链表结点应由两个域构成:数据域与下一个结点的指针域
链表的第一个结点被称为头结点,指向头结点的指针被称为头指针。
链表的最后一个结点被称为尾结点
验证一个结点是否是表尾,只须考察该结点的next域值是否为NULL(空指针)。
以下为单链表的实现
************************************************************************************* */
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}LinkNode, *LinkList;
void Init(LinkList *l);
void Insert(LinkList l, int i, ElemType e);
void Delete(LinkList l, int i, ElemType *e);
int LocateElem(LinkList l, ElemType e);
void GetElem(LinkList l, int i, ElemType *e);
void Print(LinkList l);
void Destroy(LinkList l);
void Init(LinkList *l)
{
(*l) = (LinkNode *)malloc(sizeof(LinkNode));
(*l)->data = 0; //头节点的data用来记录链表节点的数量
(*l)->next = NULL;
}
void Insert(LinkList l, int i, ElemType e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data + 1)
return;
LinkNode *p = l;
while (--i)
p = p->next;
LinkNode *n = (LinkNode *)malloc(sizeof(LinkNode));
n->data = e;
n->next = p->next;
p->next = n;
++l->data;
}
void Delete(LinkList l, int i, ElemType *e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data)
return;
LinkNode *p = l;
while (--i)
p = p->next;
LinkNode *temp = p->next;
*e = temp->data;
p->next = temp->next;
free(temp);
--l->data;
}
int LocateElem(LinkList l, ElemType e)
{
if (l == NULL)
return -1;
LinkNode *p = l->next;
int i = 1;
while (p && p->data != e)
{
++i;
p = p->next;
}
if (p == NULL)
return -1;
return i;
}
void GetElem(LinkList l, int i, ElemType *e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data)
return;
LinkNode *p = l;
while (--i)
p = p->next;
*e = p->next->data;
}
void Print(LinkList l)
{
if (l == NULL)
return;
LinkNode *p = l;
while(p->next)
{
printf("%d\n", p->next->data);
p = p->next;
}
}
void Destroy(LinkList l)
{
while (l)
{
LinkNode *temp = l;
l = l->next;
free(temp);
}
}
int main()
{
LinkList l;
Init(&l); //初始化链表
for(int i = 1; i < 21; ++i)
Insert(l, 1, i);
printf("链表的元素为:\n");
Print(l);
printf("在第1个位置插入元素:0,插入后的链表元素为:\n");
Insert(l, 1, 0);
Print(l);
printf("在第11个位置删除元素后的链表为:\n");
int e;
Delete(l, 11, &e);
Print(l);
printf("被删除的元素为:%d\n",e);
printf("链表第10个位置的元素为: ");
GetElem(l, 10, &e);
printf("%d\n",e);
int k = 15;
if((e = LocateElem(l, k)) != -1)
printf("在链表的第%d个位置找到元素%d\n",e,k);
else
printf("在链表的中未找到元素:%d\n",k);
Destroy(l); //销毁链表
return 0;
}