C语言-线性表基本操作之单链表

下面是单链表的基本操作:

#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");

}



本文出自 “hagar” 博客,请务必保留此出处http://7832308.blog.51cto.com/7822308/1390153

C语言-线性表基本操作之单链表,布布扣,bubuko.com

C语言-线性表基本操作之单链表

上一篇:javascript之文档碎片,文档碎片在理论上可以提高DOM操作的执行效率


下一篇:.NET和JAVA的比较系列(1)- 体系结构