链表适合用于频繁插入删除的场景,经常存取的效率相对顺序结构较低
//当前链表包含头结点
//头结点...第一个结点...第N个结点...尾结点
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAX_LENGTH 20
typedef int Status;
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node * next;
}LinkList;
//初始化链表
Status InitList(LinkList **L) {
//需要传入头指针的地址,因为需要修改头指针本身
*L = (LinkList*)malloc(sizeof(LinkList));
if (!(*L)) {
//分配存储空间失败
return ERROR;
}
(*L)->next = NULL;
return OK;
}
Status ListEmpty(LinkList L) {
if (L.next) {
return FALSE;
}
else {
return TRUE;
}
}
//清空链表
Status ClearList(LinkList* L) {
LinkList* temp;
LinkList* current = L->next;//指向链表的第一个结点
while (current) {
temp = current->next;
free(current);
current = temp;
}
L->next = NULL;
return OK;
}
int ListLength(LinkList L) {
int count = 0;
LinkList *first = L.next;//指向链表的第一个结点
while (first)
{
count++;
first = first->next;
}
return count;
}
Status GetElem(LinkList L,int i,ElemType *e) {
LinkList* first = L.next;//指向链表的第一个结点
for (int j = 1; j < i; j++) {
//定位到第i个元素
first = first->next;
if (!first) {
return ERROR;//
}
}
if (first) {
*e = first->data;
return OK;
}
else{
return ERROR;//主要针对头结点为空的情况
}
}
int LocateElem(LinkList L,ElemType e) {
int curPos = 0;
LinkList* first = L.next;
while (first) {
curPos++;
if (first->data == e) {
return curPos;
}
first = first->next;
}
return 0;
}
Status ListInsert(LinkList* L, int i, ElemType e) {
LinkList* curNode = L;
//定位到第i-1个结点
for (int j = 1; j < i; j++)
{
curNode = curNode->next;
if (!curNode && j != i - 1) {
//当在i-1个结点之前就没有后续结点,报错
return ERROR;
}
}
LinkList* newNode = (LinkList*)malloc(sizeof(LinkList));
newNode->data = e;
newNode->next = curNode->next;
curNode->next = newNode;
return OK;
}
Status ListDelete(LinkList *L, int i, ElemType *e) {
LinkList* curNode = L;
//定位到第i-1个结点
for (int j = 1; j < i; j++)
{
curNode = curNode->next;
if (!curNode && j != i - 1) {
//当在i-1个结点之前就没有后续结点,报错
return ERROR;
}
}
if (!(curNode->next)) {
//如果第i个元素不存在
return ERROR;
}
LinkList *iNode = curNode->next;
curNode->next = iNode->next;
*e = iNode->data;
free(iNode);
return OK;
}
Status ListPrint(LinkList L) {
LinkList* first = L.next;
int i = 1;
while (first)
{
printf("List %d:%d\n",i++,first->data);
first = first->next;
}
return OK;
}
//测试代码
int main()
{
LinkList* list = NULL;
ElemType num;
InitList(&list);
for (int i = 1; i < 10; i++) {
ListInsert(list,1,i);
}
ListPrint(*list);
ListDelete(list, 3, &num);
ListPrint(*list);
}