▶线性表的顺序存储结构
typedef struct {
ElementType *element; // 存储空间基地址
int length; // 当前长度
int listsize; // 当前分配的存储容量(ElementType)为单位)
}LinearList;
C语言部分实现如下:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1 //true
#define FALSE 0 //false
#define OK 1 //success
#define ERROR 0 //fail
#define INFEASIBLE -1 //infeasible 不可实行的
#define OVERFLOW -2 //overflow
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef int ElementType;
typedef int Status;
typedef struct {
ElementType *element;
int length; //当前长度
int listsize; //存储容量
}List;
static List list = {0};
Status initList(List *list);
Status destroy(List *list);
Status clear(List *list);
Status isEmpty(List *list);
Status length(List *list);
Status getElement(List *list, int i, ElementType *element);
Status compare(ElementType e1, ElementType e2);
Status locateElement(List *list, ElementType element, Status (* compare)(ElementType e1, ElementType e2));
Status prior(List *list, ElementType current, ElementType *prior);
Status next(List *list, ElementType current, ElementType *next);
Status insert(List *list, int i, ElementType element);
Status deleteElement(List *list, int i, ElementType *element);
Status add(List *list, ElementType element);
Status initList(List *list)
{
//分配空间
list->element = (ElementType *)malloc(LIST_INIT_SIZE * sizeof(ElementType));
if (!list->element)
{
exit(OVERFLOW);
}
list->length = 0;
list->listsize = LIST_INIT_SIZE;
return OK;
}
Status destroy(List *list)
{
if (list)
{
free(list->element);
list->element = NULL;
}
return OK;
}
Status clear(List *list)
{
int i = 0;
if (list)
{
for (i = 0; i < list->length; i++)
{
list->element[i] = 0;
}
list->length = 0;
}
return OK;
}
Status isEmpty(List *list)
{
if (0 == list->length)
{
return TRUE;
}
return FALSE;
}
Status length(List *list)
{
if (list)
{
return list->length;
}
return 0;
}
Status getElement(List *list, int i, ElementType *element)
{
if (!list)
{
return ERROR;
}
if (i < 0 || i >= list->length)
{
return ERROR;
}
*element = list->element[i];
return OK;
}
Status compare(ElementType e1, ElementType e2)
{
Status result = 2;
if (e1 > e2)
{
result = 1;
}
else if (e1 == e2)
{
result = 0;
}
else
{
result = -1;
}
return result;
}
Status locateElement(List *list, ElementType element, Status (* compare)(ElementType e1, ElementType e2))
{
ElementType i = 0;
ElementType *p = NULL;
p = list->element;
while (i < list->length && (* compare)(*p++, element))
{
i++;
}
if (i < list->length)
{
return i;
}
else
{
return 0;
}
}
Status prior(List *list, ElementType current, ElementType *prior)
{
ElementType i = 0;
i = locateElement(list, current, compare);
if (i > 0)
{
*prior = list->element[i - 1];
}
return OK;
}
Status next(List *list, ElementType current, ElementType *next)
{
ElementType i = 0;
i = locateElement(list, current, compare);
if (i != 0 && i < list->length - 1)
{
*next = list->element[i + 1];
}
return OK;
}
Status insert(List *list, int i, ElementType element)
{
ElementType *newSpace = NULL;
ElementType *insertPlace = NULL;
ElementType *temp = NULL;
if (i < 0 || i >= list->length)
{
return ERROR;
}
//长度大于容量,分配新空间
if (list->length >= list->listsize)
{
newSpace = (ElementType *)realloc(list->element, (list->listsize + LISTINCREMENT) * sizeof(ElementType));
if (!newSpace)
{
return ERROR;
}
list->element = newSpace;
list->listsize += LISTINCREMENT;
}
insertPlace = &(list->element[i - 1]);
for (temp = &(list->element[list->length - 1]); temp >= insertPlace; temp--)
{
*(temp + 1) = *temp;
}
*insertPlace = element;
list->length++;
return OK;
}
Status deleteElement(List *list, int i, ElementType *element)
{
ElementType *p = NULL;
ElementType *temp = NULL;
if (!list)
{
return ERROR;
}
if (i < 0 || i > list->length - 1)
{
return ERROR;
}
p = &list->element[i - 1];
element = p;
temp = list->element + list->length - 1;
for (++p; p <= temp; ++p)
{
*(p - 1) = *p;
}
list->length--;
return OK;
}
Status add(List *list, ElementType element)
{
if (!list)
{
return ERROR;
}
list->element[list->length] = element;
list->length++;
return OK;
}
int main()
{
int i = 0;
int element = 0;
initList(&list);
for (i = 0; i < 100; i++)
{
add(&list, i);
}
// insert(&list, 3, 100);
printf("%d\n", isEmpty(&list));
deleteElement(&list, 54, &element);
printf("%d\n", element);
for (i = 0; i < list.length; i++)
{
printf("%d, ", list.element[i]);
}
getchar();
return 0;
}
typedef struct Node {
ElementType data; // 数据
struct Node *next; // 下一个节点
}LinkedList;
C语言部分实现如下:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1 //true
#define FALSE 0 //false
#define OK 1 //success
#define ERROR 0 //fail
typedef int ElementType;
typedef int Status;
typedef struct Node {
ElementType element;
struct Node *next;
}Node, *LinkedList;
LinkedList linkedList = {0};
Status init(LinkedList linkedList);
Status createHead(LinkedList *linkedList, int n);
Status createTail(LinkedList *linkedList, int n);
Status getElement(LinkedList linkedList, int i, ElementType *element);
Status insert(LinkedList linkedList, int i, ElementType element);
Status delete(LinkedList linkedList, int i, ElementType *element);
Status init(LinkedList linkedList)
{
linkedList = (Node *)malloc(sizeof(Node));
if (!linkedList)
{
return ERROR;
}
linkedList->next = NULL;
return OK;
}
Status createHead(LinkedList *linkedList, int n)
{
int i = 0;
LinkedList point = NULL;
*linkedList = (LinkedList)malloc(sizeof(Node));
(*linkedList)->next = NULL;
for (i = 0; i < n; i++)
{
point = (LinkedList)malloc(sizeof(Node));
point->element = i;
point->next = (*linkedList)->next;
(*linkedList)->next = point;
}
return OK;
}
Status createTail(LinkedList *linkedList, int n)
{
int i = 0;
LinkedList point = NULL;
LinkedList temp = NULL;
*linkedList = (LinkedList)malloc(sizeof(Node));
(*linkedList)->next = NULL;
temp = *linkedList;
for (i = 0; i < n; i++)
{
point = (LinkedList)malloc(sizeof(Node));
point->element = i;
temp->next = point;
temp = point;
}
return OK;
}
Status getElement(LinkedList linkedList, int i, ElementType *element)
{
Node *point = NULL;
int j = 0;
point = linkedList;
while (point && j < i)
{
point = point->next;
j++;
}
if (!point || j > i)
{
return ERROR;
}
*element = point->element;
return OK;
}
Status insert(LinkedList linkedList, int i, ElementType element)
{
LinkedList point = NULL;
LinkedList insert = NULL;
int j = 0;
point = linkedList;
while (point && j < i)
{
point = point->next;
++j;
}
if (!point || j > i)
{
return ERROR;
}
insert = (LinkedList)malloc(sizeof(Node));
insert->element = element;
insert->next = point->next;
point->next = insert;
return OK;
}
Status delete(LinkedList linkedList, int i, ElementType *element)
{
LinkedList point = NULL;
LinkedList temp = NULL;
int j = 0;
point = linkedList;
while (point && j < i)
{
point = point->next;
++j;
}
if (!(point->next) || j > i)
{
return ERROR;
}
temp = point->next;
point->next = temp->next;
free(temp);
return OK;
}
int main()
{
int i = 0;
LinkedList temp = NULL;
ElementType element = 0;
createTail(&linkedList, 10);
temp = linkedList->next;
insert(linkedList, 4, 12);
delete(linkedList, 4, &element);
for (i = 0; i < 10; i++)
{
printf("%d, ", temp->element);
temp = temp->next;
}
getElement(linkedList, 4, &element);
printf("\n%d", element);
// getchar();
return 0;
}
▶线性表的双向链表存储结构
typedef struct Node {
ElementType data; // 数据
struct Node *prior; // 上一个节点
struct Node *next; // 下一个节点
}DoubleLinkedList;
C语言的部分实现如下:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1 //true
#define FALSE 0 //false
#define OK 1 //success
#define ERROR 0 //fail
typedef int ElementType;
typedef int Status;
typedef struct DNode {
ElementType element;
struct DNode *prior;
struct DNode *next;
}DNode, *DoubleLinkedList;
DoubleLinkedList doubleLinkedList = {0};
Status createHead(DoubleLinkedList *doubleLinkedList, int n);
Status createTail(DoubleLinkedList *doubleLinkedList, int n);
Status createHead(DoubleLinkedList *doubleLinkedList, int n)
{
int i = 0;
DoubleLinkedList point = NULL;
*doubleLinkedList = (DoubleLinkedList)malloc(sizeof(DNode));
(*doubleLinkedList)->next = *doubleLinkedList;
(*doubleLinkedList)->prior = *doubleLinkedList;
for (i = 0; i < n; i++)
{
point = (DoubleLinkedList)malloc(sizeof(DNode));
point->element = i;
point->next = (*doubleLinkedList)->next;
(*doubleLinkedList)->next->prior = point;
(*doubleLinkedList)->next = point;
point->prior = (*doubleLinkedList);
}
return OK;
}
Status createTail(DoubleLinkedList *doubleLinkedList, int n)
{
int i = 0;
DoubleLinkedList point = NULL;
DoubleLinkedList temp = NULL;
*doubleLinkedList = (DoubleLinkedList)malloc(sizeof(DNode));
(*doubleLinkedList)->next = NULL;
temp = *doubleLinkedList;
for (i = 0; i < n; i++)
{
point = (DoubleLinkedList)malloc(sizeof(DNode));
point->element = i;
temp->next = point;
point->prior = temp;
temp = point;
}
return OK;
}
int main()
{
int i = 0;
DoubleLinkedList temp = NULL;
createTail(&doubleLinkedList, 10);
temp = doubleLinkedList->next->next->next->next->next->next->next->next->next->next;
// temp = doubleLinkedList->next;
for (i = 0; i < 10; i++)
{
printf("%d, ", temp->element);
temp = temp->prior;
}
return 0;
}