下面是单链表的基本操作:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}LinkList;
void HeadCreateList(LinkList*&L,ElemType a[],int n)
{
LinkList *s;
int i;
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
void TailCreateList(LinkList*&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
L=(LinkList*)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void InitList(LinkList *&L)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}
void DestroyList(LinkList *&L)
{
LinkList *pre=L,*p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool ListEmpty(LinkList *L)
{
return L->next==NULL;
}
int ListLength(LinkList *L)
{
int n=0;
LinkList*p=L;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}
void DisplayList(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
e=p->data;
return true;
}
}
int LocateElem(LinkList *L,ElemType e)
{
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
i++;
}
if(p==NULL)
return 0;
else
return i;
}
bool ListInsert(LinkList *&L,int i,ElemType e)
{
int j=0;
LinkList *p=L,*s;
while(j<i-1 &&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while(j<i-1 &&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
void split(LinkList *&L,LinkList *&L1,LinkList*&L2)
{
LinkList*p=L->next,*q,*r1;
L1=L;
r1=L1;
L2=(LinkList*)malloc(sizeof(LinkList));
L2->next=NULL;
while(p!=NULL)
{
r1->next=p;
r1=p;;
p=p->next;
q=p->next;
p->next=L2->next;
L2->next=p;
p=q;
}
r1->next=NULL;
}
void delmaxnode(LinkList *&L)
{
LinkList *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
while(p!=NULL)
{
if(maxp->data<p->data)
{
maxp=p;
maxpre=pre;
}
pre=p;
p=p->next;
}
maxpre->next=maxp->next;
free(maxp);
}
void sort(LinkList *&L)
{
LinkList *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while(p!=NULL)
{
q=p->next;
pre=L;
while(pre->next!=NULL &&pre->next->data<p->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
void main()
{
printf("1-创建一个单链表 2-排序单链表\n");
printf("3-插入一个元素 4-删除一个元素\n");
printf("5-删除最大的节点 \n");
LinkList *s;
int a[15]={0};
printf("enter 10 data:\n");
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
HeadCreateList(s,a,10);
DisplayList(s);
printf("排序单链表:\n");
sort(s);
printf("input the list:\n");
DisplayList(s);
printf("插入一个节点:\n");
ListInsert(s,3,4);
DisplayList(s);
printf("删除一个节点:\n");
int e=0;
ListDelete(s,5,e);
DisplayList(s);
printf("the delete data is :%d\n",e);
printf("delete the max node:\n");
delmaxnode(s);
printf("input:\n");
DisplayList(s);
system("pause");
}