前几天在学习单链表,然后在博客上看到前人编写了19个功能
他的博客地址:http://www.cnblogs.com/lifuqing/archive/2011/08/20/List.html
然后自己也想编写一个,编了几天写出十几个,今晚调试了下,都能正常运行,不过不知道有没有bug,所以发这共同学习下,小弟在此先谢过了
头文件:
#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType; //Êý¾ÝÀàÐÍ
typedef struct LinkList
{
ElemType date;
struct LinkList *pNext;
}LinkList;
int Init_LinkList(LinkList **L);
LinkList* Create_LinkList();
void Print_LinkList(LinkList *L);
int Clear_LinkList(LinkList *L);
int Length_LinkList(LinkList *L);
int Empty_LinkList(LinkList *L);
int GetElem_LinkList(LinkList *L,int i,ElemType *e);
ElemType *EetElemAddr(LinkList *L, ElemType x);
int modifyElem(LinkList *L,int i,ElemType x);
int InsertHead_LinkList(LinkList **L,ElemType x);
int InsertEnd_LinkList(LinkList *L,ElemType x);
int Insert_LinkList(LinkList *L,int i,ElemType x);
#endif // _LINK_LIST_H_</strong></span><span style="color:#33ff33;">
</span>
<strong><span style="font-size:24px;">C文件:</span></strong>
<strong><span style="font-size:24px;"></span></strong><pre name="code" class="cpp">/************************************************************************/
/** 以下是关于线性表链接存储(单链表)操作的18种算法 */
/** 1.初始化线性表,即置单链表的表头指针为空 */
/** 2.创建线性表,此函数输入负数终止读取数据*/
/** 3.打印链表,链表的遍历*/
/** 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
/** 5.返回单链表的长度 */
/** 6.检查单链表是否为空,若为空则返回1,否则返回0 */
/** 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 *e返回它的值*/
/** 8.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
/** 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
/** 10.向单链表的表头插入一个元素 */
/** 11.向单链表的末尾添加一个元素 */
/** 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
/** 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/** 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
/** 15.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
/** 16.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
/** 17.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
/** 18.交换2个元素的位置 */
/** 19.将线性表进行快速排序 */
/************************************************************************/
#include "linklist.h"
/** 1.初始化线性表,即置单链表的表头指针为空 */
int Init_LinkList(LinkList **L)
{
*L=NULL;
return OK;
}
/** 2.创建线性表,此函数输入负数终止读取数据 n表示长度*/
LinkList* Create_LinkList()
{
//先建立一个头结点
int i,n;
LinkList *p,*q,*L;
L=(LinkList*)malloc(sizeof(LinkList));
q=L;
if(L==NULL)exit(0);
L->pNext = NULL; //申请一个头结点
printf("Please input the length of linked list:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
p=(LinkList *)malloc(sizeof(LinkList));//申请一个新节点
if(p==NULL)exit(0);
printf("please input the data%d:\n",i+1);
scanf("%d",&p->date);
p->pNext=q->pNext;
q->pNext=p;
q=p;
}
return L;
}
/** 3.打印链表,链表的遍历*/
void Print_LinkList(LinkList *L)
{
LinkList *p;
p=L;
if(p->pNext==NULL)
{
printf("The linked list is NULL!!");
exit(0);
}
else
{
while(p->pNext!=NULL)
{
p=p->pNext;
printf("%5d",p->date);
}
printf("\n");
}
}
/** 4.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
int Clear_LinkList(LinkList *L)
{
LinkList *p;
if(L->pNext==NULL)
{
printf("The linked list is NULL!!");
exit(0);
}
while(L->pNext!=NULL)
{
p=L->pNext;
free(L);
L=p;
}
return OK;
}
/** 5.返回单链表的长度 */
int Length_LinkList(LinkList *L)
{
int i=0;
LinkList *p;
p=L;
while(p->pNext!=NULL)
{
i++;
p=p->pNext;
}
return i;
}
/** 6.检查单链表是否为空,若为空则返回1,否则返回0 */
int Empty_LinkList(LinkList *L)
{
if(L->pNext==NULL)
return OK;
else
return 0;
}
/** 7.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 ,*e返回它的值*/
int GetElem_LinkList(LinkList *L,int i,ElemType *e)
{
LinkList *p;
int n=0;
p=L;
if(!p || n>i ) return ERROR;
while(((p->pNext)!=NULL) && (n<i))
{
p=p->pNext;
n++;
}
*e=p->date;
return OK;
}
/** 8.从单链表中查找data数据域为x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
ElemType *EetElemAddr(LinkList *L, ElemType x)
{
LinkList *p;
p=L;
if(p->pNext==NULL)exit(0);
while(p->date!=x)
{
p=p->pNext;
}
if(p->date!=x)
{
printf("NO number x !!!");
return NULL;
}
return &(p->date);
}
/** 9.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int modifyElem(LinkList *L,int i,ElemType x)
{
LinkList *p;
int j=1;
p=L;
if(p->pNext==NULL)
{
printf("The linked list is NULL");
return ERROR;
}
if(i<1)exit(0);
while(p->pNext!=NULL )
{
p=p->pNext;
if(j==i)
break;
j++;
}
p->date=x;
return OK;
}
/** 10.向单链表的表头插入一个元素 */
int InsertHead_LinkList(LinkList **L,ElemType x)
{
LinkList *p;
p=(LinkList*)malloc(sizeof(LinkList));
if((*L)==NULL)exit(0);
p->date=x;
p->pNext=(*L)->pNext;
(*L)->pNext=p;
return OK;
}
/** 11.向单链表的末尾添加一个元素 */
int InsertEnd_LinkList(LinkList *L,ElemType x)
{
LinkList *p,*q;
p=L;
while(p->pNext!=NULL)
{
p=p->pNext;
}
q=(LinkList*)malloc(sizeof(LinkList));
q->date=x;
p->pNext=q;
q->pNext=NULL;
return OK;
}
/** 12.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
int Insert_LinkList(LinkList *L,int i,ElemType x)
{
LinkList *p,*q;
int j=1;
p=L;
if(i<1)return ERROR;
while(p->pNext)
{
if(j==i)break;
p=p->pNext;
j++;
}
q=(LinkList*)malloc(sizeof(LinkList));
q->date=x;
q->pNext=p->pNext;
p->pNext=q;
return OK;
}
/** 13.向有序单链表中插入元素x结点,使得插入后仍然有序 */
/** 14.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
</pre><pre name="code" class="cpp">持续更新中。。。。