1)链表
- 用一组物理位置任意的存储单元来存放线性表的 数据元素。 这组存储单元既可以是连续的,也可以是 不连续的,甚至是零散分布在内存中的任意位置上的。 因此,链表中元素的逻辑次序和 物理次序不一定相同。好比小明家住在1号楼;小红家住在2号楼,同时小红知道小明家的地址为1号楼;小刚家住在3号楼,同时小刚知道小红家的地址为2号楼...
2)单链表的基本操作(带头节点)
- 单链表的基本知识不再赘述。
include <stdio.h>
#include <stdlib.h>
#define Status int //状态
#define OVERFLOW -1 //溢出
#define OK 1 //正确
#define ERROR 0 //错误
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList_L(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
(*L)->data = 0;
return OK;
}
// 按序号查找
Status GetElemt_L(LinkList L,int i,ElemType *e)
{
LNode *p = L->next;
int j = 1;
while (p && j < i)
{
p = p->next;
++j;
}
if(!p || j > i)
return ERROR;
*e = p->data;
return OK;
}
//插入
Status ListInsert_L(LinkList *L,int i,ElemType e)
{
LNode *p = (*L), *s = NULL;
int j = 0;
while (p && j < i-1)
{
p = p->next;
++j;
}
if(!p || j > i-1)
return ERROR;
s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除
Status ListDelete_L(LinkList *L,int i,ElemType *e)
{
LNode *p = (*L), *q = NULL;
int j = 0;
while (p->next && j < i-1)
{
p = p->next;
++j;
}
if(!(p->next) || j > i-1)
return ERROR;
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return OK;
}
//生成链表
void CreateList_L(LinkList *L,int n){
int i;
LNode *s = NULL;
(*L) = (LNode *)malloc(sizeof(LNode));
(*L)->data = 0;
(*L)->next = NULL;
for (i = 1; i <= n; i++)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = i * 11;
s->next = (*L)->next;
(*L)->next = s;
}
} // CreateList_L
Status visit(ElemType e) {
if(printf("%d ", e))
return OK;
return ERROR;
}
Status visit1(ElemType e) {
if(printf("%d\n", e))
return OK;
return ERROR;
}
// 遍历
Status ListTraverse_L(LinkList L, Status (*pvisit)(ElemType)) {
LNode *p = L->next;
while (p) {
if(!pvisit(p->data))
return ERROR;
p = p->next;
}
printf("\n");
return OK;
}
int main(void)
{
LinkList L;
ElemType e, dataArr[5] = {11, 22, 33, 44, 55};
int i;
InitList_L(&L);
printf("L = %p\n", L);
printf("L->next = %p\n", L->next);
printf("L->data = %d\n", L->data);
for (i = 1; i <= 5; i++)
{
ListInsert_L(&L, i, dataArr[i-1]);
}
ListTraverse_L(L, visit);
ListDelete_L(&L, 2, &e);
ListTraverse_L(L, visit);
return 0;
}
4)静态链表(待补充)
5)循环链表
6)双向循环链表