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

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


 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值