线性表的链式存储
- 链式存储:线性表的链式存储指用一组任意的存储单元(可以连续,也可以不连续)存储线性表中的数据元素。
- 单链表:
①定义:为了反映数据元素之间的逻辑关系,除了要表示每个数据元素具体的内容(数据域data),还附加了一个它的直接后继元素来存储元素的信息(指针域next),这样构成的链表称为单链表。
②单链表的分类:分为带头结点(其next域指向链表第一个结点的存储地址)和不带头结点。这里讨论的是带头结点的单链表。
③类型定义:利用C语言的结构体指针来描述。
typedef int DataType;
typedef struct linknode
{
DataType data; /*定义结点的数据域*/
struct linknode* next; /*定义结点的指针域*/
}LinkList;
LinkList *head /*定义指向该结点类型的指针head*/
head=(LinkList *)malloc(sizeof(LinkList));/*动态申请一个结点空间,让head指向该结点*/
free(head); /*释放指针所指的结点空间*/
④单链表的基本操作
- 单链表的初始化
即构造一个仅包含头结点的空单链表
LinkList *InitList()
{ LinkList *head;
head=(LinkList*)malloc(sizeof(LinkList));
head->next=NULL; /*头结点的指针域为空,表示空链表*/
return head;
}
- 单链表的建立
头插法
void CreateListH(LinkList *head, int n)
{
LinkList *s;
int i;
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++)
{
s = (LinkList*)mallloc(sizeof(LinkList));
scanf("%d", &s->data);
s->next = head->next;
head->next = s;
}
printf("建立链表操作成功");
}
尾插法
void CreateListH(LinkList* head, int n)
{
LinkList* s, * last;
int i;
last = head;
printf("请输入%d个整数:", n);
for (i = 0; i < n; i++)
{
s = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &s->data);
s->next = NULL;
last->next = s;
last = s;
}
printf("建立链表操作成功");
}
- 求表长操作
int LengthList(LinkList* head)
{
LinkList* p = head->next;
int j = 0;
while (p != NULL)
{
p = p->next;
j++;
}
return j;
}
- 查找操作
按值查找
void Locate(LinkList* head, DataType x)
{
int j = 1;
LinkList* p;
p = head->next;
while (p != NULL && p->data != x)
{
p = p->next;
j++;
}
if (p != NULL)
printf("在表的第%d位找到值为%d的结点!", j, x);
else
printf("未找到值为%d的结点!", x);
}
按序号查找
void SearchList(LinkList* head, int i)
{
LinkList* p;
int j = 0;
p = head;
if (i > LengthList(head))
printf("位置错误");
while (p->next != NULL && j < i)
{
p = p->next;
j++;
}
if (j == i)
printf("在第%d位上的元素值为%d!", i, p->data);
}
- 插入
void InsList(LinkList* head, int i, DataType x)
{
int j = 0;
LinkList* p, * s;
p = head;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p != NULL)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = x;
s->next = p->next;
p->next = s;
printf("插入成功");
}
else
printf("插入失败");
}
- 删除操作
void DeIList(LinkList* head, int i)
{
int j = 0;
DataType x;
LinkList* p = head, * s;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p->next != NULL && j == i - 1)
{
s = p->next;
x = s->data;
p->next = s->next;
free(s);
printf("删除第%d位上的元素%d成功!", i, x);
}
else
printf("删除结点位置错误,删除失败!");
}