#include<stdio.h>
#include<stdlib.h>
typedef int elemType;
typedef struct Node{//定义单链表节点类型
elemType data;
Node *next;
}Node,*linkList;
//初始化链表,单链表的头指针为空
int initList(linkList &L)
{
L= (Node *)malloc(sizeof(Node));
if(!L) exit(-1);
L->next= NULL;
return 1;
}
int destoryList(linkList &L)
{
Node *p;
while(L)
{
p=L->next;
free(L);
L=p; //?
}
return 1;
}
//将L重置为空链表
int clearList(linkList &L)
{
Node *p,*q;
if(L==NULL)
return 0;
p=L->next;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return 1;
}
//判断单链表是否为空
int isEmptyList(linkList &L)
{
if(L->next)
return 0;
else return 1;
}
//返回单链表中的个数
int listLength(linkList &L)
{
int i=0;
Node *p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
//取得第i个元素
int getElem (linkList L,int i,elemType &e)
{
int j=0;
Node *p=L->next;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
return -1;
}
e=p->data;
return 1;
}
//查询e的位置
int locateElem(linkList L,elemType e)
{
int i=0;
linkList p= L->next;
while(p)
{
i++;
if(p->data==e)
return i;
p=p->next;
}
return 0;
}
//返回前驱
int priorElem(linkList L,elemType pro_e)
{
linkList q,p=L->next;
while(p->next)
{
q=p->next;
if(q->data==pro_e)
{
return p->data;
}
p=q;
}
}
//返回后继
int nextElem(linkList L,elemType next_e)
{
linkList p;
p=L->next;
while(p->next)
{
if(p->data==next_e)
return p->next->data;
p=p->next;
}
return -1;
}
//在第i个位置插入e
int insertList(linkList &L,int i,elemType e)
{
int j=0;
linkList p=L,s=NULL;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return -1;
s=(linkList )malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
//删除第i个元素 e为返回的删除 的元素
int deleteList(linkList &L,int i,elemType &e)
{
linkList p=L,q;
int j=0;
if(!p||j>i-1) return -1;
while(p->next!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return 1;
}
//打印链表
void printList(linkList L)
{
linkList p=L->next;
for(int i=0;i<listLength(L);i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
linkList L;
elemType e;
initList(L);
//destoryList(L);
clearList(L);
printf("%d\n",listLength(L));
for(int i=1;i<10;i++) //i>0&&i<listLength
{
insertList(L,i,i);
}
printList(L);
getElem(L,7,e);
printf("%d\n",e);
printf("%d\n",priorElem(L,5));
deleteList(L,2,e) ;
printf("%d\n",e);
printList(L);
printf("%d\n",priorElem(L,5));
printf("%d\n",nextElem(L,5));
}原文地址:http://blog.csdn.net/whk100312/article/details/26389833