单链表的19个功能编写(求指导)

来源:互联网 发布:淘宝指数 编辑:程序博客网 时间:2024/06/06 06:04

前几天在学习单链表,然后在博客上看到前人编写了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 0typedef 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">持续更新中。。。。




0 0
原创粉丝点击