链表的实现及对它的一些操作:
#include <malloc.h>
#define ERROR 2
#define OK 1
typedef int ElemType;
typedef struct LNode
...{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
//初始化
LinkList ListInit()
...{
LNode *base=(LinkList)malloc(sizeof(LNode));
base->data=0;
base->next=NULL;
return base;
}
//插入一个元素
int ListInsert(LinkList L,int i,ElemType e)
...{
LNode *p,*s;
int j=0;
p=(LNode *)L;
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;
}
//查找一个元素
int GetElem(LinkList L,int i,ElemType *e)
...{
LNode *p;
int j=1;
p=(LNode *)L->next;
while(p&&j<i)
...{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
//倒置顺序
void Reverse_List(LNode *head)
...{
LNode *p=head->next,*q;
head->next=NULL;
while(p)
...{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
}
//把最小的元素移到表首
void MoveMinFirst(LinkList head)
...{
LNode *p,*q,*r;
r=head; //r指向头结点
p=head->next; //p指向第一个结点
while(p->next)
...{
if(p->next->data<r->next->data)
r=p;
p=p->next;
}
if(r->next!=head->next) //不只一个元素
...{
q=r->next;
r->next=q->next;
q->next=head->next;
head->next=q;
}
}
//求最大值(递归算法)
int GetMaxValue(LinkList head)
...{
int temp;
if(!head->next)
return head->data;
else
...{
temp=GetMaxValue(head->next);
if(head->data>=temp)
return head->data;
else
return temp;
}
}
//选择排序
void SelectSort(LinkList L)
...{
LNode *p,*q,*r;
int temp;
p=L->next;
while(p)
...{
q=p->next;
r=p; //r指向最小的结点
while(q)
...{
if(q->data<r->data)
r=q;
q=q->next;
}
if(r!=p)
...{
temp=p->data;
p->data=r->data;
r->data=temp;
}
p=p->next; //p指向已排序的尾部
}
}
//顺序输出
void Display(LinkList L)
...{
LNode *p=L->next;
while(p)
...{
printf("%d ,",p->data);
p=p->next;
}
}
//倒序输出
void Reverse_OutPut(LNode *head)
...{
if(head)
...{
Reverse_OutPut(head->next);
printf("%d ,",head->data);
}
}
int main(int argc, char* argv[])
...{
int a;
LinkList La;
La=ListInit();
ListInsert(La,1, 7);
ListInsert(La,2, 9);
ListInsert(La,3, 6);
ListInsert(La,4, 3);
ListInsert(La,5, 11);
Display(La);
printf(" ");
Reverse_OutPut(La->next);
printf(" ");
Display(La);
Reverse_List(La);
printf(" after reverse... ");
Display(La);
SelectSort(La);
printf(" after sort! ");
Display(La);
printf(" max value is:%d ",GetMaxValue(La->next));
printf(" after move! ");
MoveMinFirst(La);
Display(La);
GetElem(La,3,&a);
printf("a=%d",a);
return 0;
}
本文介绍了一个简单的链表数据结构,并提供了多种链表操作方法,包括插入、查找、反转、选择排序等。通过实例演示了如何使用这些方法进行链表元素的操作。
1万+

被折叠的 条评论
为什么被折叠?



