链接存储方法:
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继 结点的地址(或位置)信息(称为指针(pointer)或链(link))
链表的结点结构
data域–存放结点值的数据域
next域–存放结点的直接后继的地址(位置)的指针域(链域)
单链表类型描述
[code lang=”CPP”]
typedef int DataType; //定义数据类型
typedef struct LNode // 定义节点类型
{
DataType data; // 节点的数据存储域
struct LNode *next; // 节点的指针域
}ListNode;
typedef ListNode *LinkList;
[/code]
代码示例如下
下载地址:https://github.com/gongjiehong/ListNode/archive/master.zip
[code lang=”C”]
#include <stdlib.h>
#include <stdio.h>
typedef int DataType; //定义数据类型
typedef struct LNode // 定义节点类型
{
DataType data; // 节点的数据存储域
struct LNode *next; // 节点的指针域
}ListNode;
typedef ListNode *LinkList;
void init_list(LinkList *head, DataType data); // 初始化线性表
int list_is_empty(LinkList head); // 判断表是否为空
ListNode *get(LinkList head, int index); // 通过index查找数据
ListNode *locate_elem(LinkList head, DataType data); // 通过内容查找
int locate_postion(LinkList head, DataType data); // 查找定位
int insert_list(LinkList head, int index, DataType data); // 插入数据
int delete_list(LinkList head, int index, DataType *dataVector); // 删除数据并查看删除的值是什么
int list_length(LinkList head); // 表长度
void destroy_list(LinkList head); // 销毁表
[/code]
[code lang=”C”]
#include "ListNode.h"
void init_list(LinkList *head, DataType data) // 初始化线性表
{
*head = (ListNode *)malloc(sizeof(ListNode));
if (*head == NULL)
{
printf("初始化失败!");
exit(-1);
}
(*head)->next = NULL;
}
int list_is_empty(LinkList head) // 判断表是否为空
{
if (head->next != NULL)
{
return 0;
}
else
{
return 1;
}
}
ListNode *get(LinkList head, int index) // 通过index查找数据
{
ListNode *tempPoint;
int j;
/* 等价于判空
if (head->next == NULL)
{
return NULL;
}
*/
if (list_is_empty(head))
{
return NULL;
}
if (index < 0) { return NULL; } j = 0; tempPoint = head; while (tempPoint->next != NULL && j < index) { tempPoint = tempPoint->next;
j++;
}
if (j == index)
{
return tempPoint;
}
else
{
return NULL;
}
}
ListNode *locate_elem(LinkList head, DataType data) // 通过内容查找
{
if (list_is_empty(head))
{
return NULL;
}
if (head->data == data)
{
return head;
}
LinkList tempPoint = head->next;
int is_founded = 0;
while (tempPoint != NULL)
{
if (tempPoint->data == data)
{
is_founded = 1;
break;
}
else
{
tempPoint = tempPoint->next;
}
}
if (is_founded)
{
return tempPoint;
}
else
{
return NULL;
}
}
int locate_postion(LinkList head, DataType data) // 查找定位
{
if (list_is_empty(head))
{
return 0;
}
if (head->data == data)
{
return 0;
}
LinkList tempPoint = head->next;
int index = 1;
int is_founded = 0;
while (tempPoint != NULL)
{
if (tempPoint -> data == data)
{
is_founded = 1;
break;
}
else
{
tempPoint = tempPoint->next;
index++;
}
}
if (is_founded)
{
return index;
}
else
{
return 0;
}
}
int insert_list(LinkList head, int index, DataType data) // 插入数据
{
// if (list_is_empty(head))
// {
// return 0;
// }
//
// if (index >= list_length(head))
// {
// return 0;
// }
ListNode *tempPoint, *prePoint;
int j = 0;
tempPoint = head;
while (tempPoint != NULL && j < index – 1) { tempPoint = tempPoint->next;
j++;
}
if (tempPoint == NULL)
{
printf("位置有误");
return 0;
}
prePoint = (ListNode *)malloc(sizeof(ListNode));
if (prePoint == NULL)
{
return 0;
}
prePoint->data = data;
/*插入结点操作*/
prePoint->next = tempPoint->next;
tempPoint->next = prePoint;
return 1;
}
int delete_list(LinkList head, int index, DataType *dataVector) // 删除数据并查看删除的值是什么
{
ListNode *pre,*p;
int j;
pre = head;
j = 0;
while(pre->next != NULL && pre->next->next != NULL && j < index-1)/*判断是否找到前驱结点*/ { pre=pre->next;
j++;
}
if(j != index-1) /*如果没找到要删除的结点位置,说明删除位置错误*/
{
printf("删除位置错误");
return 0;
}
/*指针p指向单链表中的第i个结点,并将该结点的数据域值赋值给e*/
p = pre->next;
*dataVector = p->data;
/*将前驱结点的指针域指向要删除结点的下一个结点,也就是将p指向的结点与单链表断开*/
pre->next=p->next;
free(p); /*释放p指向的结点*/
return 1;
}
int list_length(LinkList head) // 表长度
{
ListNode *tempPoint;
int count = 0;
tempPoint = head;
while(tempPoint->next != NULL)
{
tempPoint = tempPoint->next;
count++;
}
return count;
}
void destroy_list(LinkList head) // 销毁表, 从起始节点一直往后销毁释放内存
{
ListNode *p,*q;
p = head;
while(p != NULL)
{
q = p;
p = p->next;
free(q);
}
}
[/code]
[code lang=”C”]
#include <iostream>
#include "ListNode.c"
int main(int argc, const char * argv[]) {
// insert code here…
std::cout << "Hello, World!\n";
LinkList listA;
DataType data = NULL;
init_list(&listA, data);
for (int index = 1; index < 100; index ++)
{
insert_list(listA, index, index);
}
printf("链表长度为:%d\n", list_length(listA));
//显示链表的内容;
printf("链表的内容为:\n");
for (int i = 1; i <= 100; i++) { ListNode *p = get(listA,i); if (p) { printf("%5d",p->data);
}
}
printf("\n");
delete_list(listA, 7, &data);
for (int i = 1; i <= 100; i++) { ListNode *p = get(listA,i); if (p) { printf("%5d",p->data);
}
}
printf("\n");
delete_list(listA, 7, &data);
for (int i = 1; i <= 100; i++) { ListNode *p = get(listA,i); if (p) { printf("%5d",p->data);
}
}
printf("\n");
return 0;
}
[/code]