数据结构之单链表
//结点和单链表的描述 typedef int ElemType; typedef struct Node { ElemType data; // 数据域 struct Node *next; // 指针域 } LNode, *LinkList; LinkList L; // L 为单链表的头指针
头插法创建链表
LinkList Create_LinkListF(int n) { LinkList L,s; int i,x; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; for(i=1;i<=n;i++) { printf("请输入第%d个数:",i); scanf("%d",&x); s=(LinkList)malloc(sizeof(LNode)); s->data=x; s->next=L->next; L->next=s; } return L; }
尾插法创建链表
//尾插法创建链表 LinkList Create_LinkListR(int n) { LinkList L,s,r; int i,x; L=(LinkList)malloc(sizeof(LNode)); r=L; for(i=1;i<=n;i++) { printf("请输入第%d个数:",i); scanf("%d",&x); s=(LinkList)malloc(sizeof(LNode)); s->data=x; r->next=s; r=s; } r->next=NULL; return L; }
求长度
//求长度 int Length_List(LinkList L)
{ LinkList p; int j=0; p=L->next; while(p)
{ j++; p=p->next; } return j; }
定位操作//定位操作
(LinkList L, int i, ElemType *e)
{ // L是带头结点的链表的头指针,以 e 返回第 i 个元素 p = L->next;
j = 1; // p指向第一个结点,j为计数器 while (p && j<i)
{
p = p->next;
++j;
} // 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空 if ( !p || j>i ) return ERROR; // 第 i 个元素不存在 *e = p->data; // 取得第 i 个元素 return OK; } // GetElem
按值查找
LinkList Locate(LinkList L,int key) { LinkList p=L–>next; while( p && p–>data!=key) p=p–>next; return p; }
插入操作
//插入操作
Status ListInsert(LinkList L, int i, ElemType e)
{
// L 为带头结点的单链表的头指针,本算法
// 在链表中第i 个结点之前插入新的元素e
p = L;
j = 0;
while (p && j < i-1)
{
p = p->next;
++j;
} // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR; // i 大于表长或者小于1 ……
} // LinstInsert
删除操作
//删除操作 Status ListDelete_L(LinkList L, int i, ElemType &e) { // 删除以 L 为头指针(带头结点)的单链表中第 i 个结点 p = L; j = 0; while (p->next && j < i-1) { p = p->next; ++j; } // 寻找第 i 个结点,并令 p 指向其前趋 if (!(p->next) || j > i-1) return ERROR; // 删除位置不合理 q = p->next; p->next = q->next; // 删除并释放结点 e = q->data; free(q); return OK; } // ListDelete_L
清空
//清除 void ClearList(Linklist L) { // 将单链表重新置为一个空表 while (L->next) { p=L->next; L->next=p->next; free(p); } } // ClearList