链表,不仅要存储每个数据元素,还需要存储其直接后继的存储地址
结点Node:数据域element+指针域link
每个结点只包含一个指针域的链表称为单链表
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotPresent 4
#define Duplicate 5
typedef int Status;
//单链表的定义
typedef int ElemType;
typedef struct node
{
ElemType element;
struct node *link;
}Node;
typedef struct singleList
{
Node *first;
int n;
} SingleList;
//单链表的初始化
Status Init(SingleList *L)
{
L->first = NULL;
L->n = 0;
return OK;
}
//单链表的查找
Status Find(SingleList L,int i,ElemType *x)
{
Node *p;
int j;
if(i<0 || L.n-1)
return ERROR;
p = L.first;
for(j=0;j<i;j++)
p=p->link;
*x = p->element;
return OK;
}
Status Insert(SingleList *L,int i,ElemType x)
{
Node *p,*q;
int j;
if (i<-1 || i>L->n-1)
return ERROR;
p = L->first;
for(j=0;j<i;j++)
{
p = p->link;
}
q = (Node*)malloc(sizeof(Node));
q->element = x;
if(i>-1)
{
q->link = p->link;
p->link = q;
}
else
{
q->link = L->first;
L->first = q;
}
L->n++;
return OK;
}
//单链表的删除
Status Delete(SingleList *L,int i)
{
int j;
Node *p,*q;
if(!L->n)
return ERROR;
if(i<0 || i>L->n-1)
return ERROR;
q = L->first;
p = L->first;
for(j=0;j<i-1;j++)
q = q->link;
if (i==0)
L->first = L->first->link;
else
{
p = q->link;
q->link = p->link;
}
free(p);
L->n--;
return OK;
}
//单链表的输出
Status Output(SingleList *L)
{
Node *p;
if (!L->n) return ERROR;
p = L->first;
while(p)
{
printf("%d ",p->element);
p = p->link;
}
printf("\n");
return OK;
}
//单链表的撤销
void Destroy(SingleList *L)
{
Node *p;
while(L->first)
{
p = L->first->link;
free(L->first);
L->first = p;
}
}
int main(void)
{
int i,x;
SingleList list;
Init(&list);
for(i=0;i<9;i++)
Insert(&list,i-1,i);
printf("Insert-->The LinkList is:");
Output(&list);
Delete(&list,2);
printf("Delete-->The LinkList is:");
Output(&list);
Find(list,5,&x);
printf("the find value is:%d ",x);
Destroy(&list);
return 0;
}