线性表–单链表的代码实现(完整):
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
//单链表的存储结构
typedef struct Node
{
ElemType data;
struct Node* next;
}Node, * LinkList;
//初始化操作
Status InitList(LinkList* L)
{
*L = (LinkList)malloc(sizeof(Node));
if (!(*L))
{
return ERROR;
}
(*L)->next = NULL;
return OK;
}
//单链表的读取
Status GetElem(LinkList L, int i, ElemType* e)
{
int j;
LinkList p;
p = L->next;
j = 1;
while (p && j < i) //p不为空,循环遍历到i
{
p = p->next;
j++;
}
if (!p || j > i)
{
return ERROR;
}
*e = p->data;
return OK;
}
//插入操作
Status ListInsert(LinkList* L, int i, ElemType e)
{
int j;
LinkList p, s;
p = *L;
//此时p为链表中带头结点
j = 1;
while (p && j < i) // 用于寻找第i个结点
{
p = p->next;
j++;
}
if (!p || j > i)
{
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除操作
Status ListDelete(LinkList* L, int i, ElemType* e)
{
int j;
LinkList p, q;
p = *L;
j = 1;
while (p->next && j < i)
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
{
return ERROR;
}
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return OK;
}
//头插法
void CreateListHead(LinkList* L, int n)
{
LinkList p;
int i;
srand(time(0)); // 初始化随机数种子
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node)); // 生成新结点
p->data = rand() % 100 + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}
//尾插法
void CreateListTil(LinkList* L, int n)
{
LinkList p, r;
int i;
srand(time(0));
//初始化随机数种子
*L = (LinkList)malloc(sizeof(Node));
r = *L;
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
r->next = p;
r = p;
}
r->next = NULL;
}
//整表清空
Status ClearList(LinkList* L)
{
LinkList p, q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
return OK;
}
//打印
void ShowList(LinkList L)
{
LinkList p;
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
}
//主方法
int main()
{
LinkList L;
Status i;
i = InitList(&L);
CreateListHead(&L, 10); //调用头插法操作函数创建长度为10的单链表
ShowList(L);
return 0;
}