码迷,mamicode.com
首页 > 其他好文 > 详细

链表------纯手工制造

时间:2017-11-16 19:48:26      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:nbsp   lis   ted   compare   get   define   ace   efi   str   

/***************************************************************
Author        :h-j-w
Created Time  :2017-11-16
File Name     :链表的基本存储操作
**************************************************************/

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<malloc.h>
#include<algorithm>
#define OK  1
#define ERROR 0
#define OVERFLOW 1
using namespace std;
/**************************************************************/
typedef int Status;
typedef int ElemType;

typedef struct LNode
{
    ElemType data;
    int length;
    struct LNode *next;
}*Node , *LinkList;

/**************************************************************/
//建表
Status Init(LinkList &L)
{
    Node p = (Node)malloc(sizeof(LNode));
    if(p)
    {
        L = p;
        p->next = NULL;
        L->length = 0;
        return OK;
    }
    else
        return ERROR;
}
/**************************************************************/
//在第i个位置插入元素e,需要找到其前一个结点
Status Insert(LinkList &L , int i, ElemType e)
{
    Node p,s;
    p = L;
    int j = 0;

    while(p && j < i - 1) //找到第i-1个结点
    {
        p = p -> next;
        ++j;
    }
    if(!p || j > i - 1)
        return ERROR;
    s = (Node)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    L->length++;
}
/**************************************************************/
//删除第i个元素,并用e返回其值,若不存在返回ERROR
Status Delete(LinkList &L, int i, ElemType &e)
{
    if(i < 1 || i > L->length)//i值不合法
        return ERROR;
    int j = 0;
    Node p,q;
    p = L;
    while(p->next && j < i - 1)
    {
        p = p->next;
        j++;
    }
    if(!(p->next) || j > i - 1)
        return ERROR;
    q = p->next;
    p -> next = q -> next;
    e = q->data;
    free(q);
    L->length--;
    return OK;
}
/**************************************************************/
//查询链表中第一个与e满足compare()关系的元素的位置,不存在则返回0
bool compare(ElemType e1 , ElemType e2)
{
    if(e1 > e2)
        return true;
    else
        return false;
}
int Locate(LinkList L ,ElemType e , bool (*compare)(ElemType,ElemType))
{
    Node p;
    p = L->next;
    int j = 1;
    while( j <= L->length && (!(*compare)(p->data,e)))
    {
         p = p -> next;
         j++;
    }
    if(j <= L->length)
        return j;
    else
        return 0;
}
/**************************************************************/
//查询第i个位置的元素值,用e返回,否则返回ERROR
int Getelem(LinkList L , int i)
{
    ElemType e;
    if(i < 1 || i > L->length)
        return ERROR;
    Node p;
    p = L;
    int j = 0;
    while( p && j < i)
    {
        p =  p->next;
        j++;
    }
    if(!p || j > i)
        return ERROR;
    e = p->data;
    return e;
}
/**************************************************************/
//判断链表是否为空
bool Empty(LinkList L)
{
    if(L->next == NULL)
        return true;
    else
        return false;
}
/**************************************************************/
//清空链表
Status Clear(LinkList &L)
{
    Node p;
    while(L->next)
    {
        p = L->next;
        L->next = p->next;
        free(p);
    }
    L->next = NULL;
    L->length = 0;
    return OK;
}
/**************************************************************/
int main()
{
    LinkList L;
    ElemType e;
    Init(L);
    int n,i;
    i = 0;
    while(~scanf("%d",&n))
    {
        if(n == 0)
            break;
        i++;
        Insert(L,i,n);
    }
    printf("链表的长度为:%d\n",L->length);
/**************************************************************/
    //遍历
    printf("链表的元素为:");
    Node tmp;
    tmp = L->next;
    while(tmp)
    {
        printf("%d",tmp->data);
        if(tmp->next != NULL)
            printf(" ");
        else
            printf("\n");
        tmp = tmp->next;
    }
/**************************************************************/
    //删除第x个位置上的元素
    int x;
    printf("请输入想要删除的元素的位置:");
    scanf("%d",&x);
    Delete(L,x,e);
    printf("删除的元素为第%d个,值为:%d\n",x,e);
    printf("链表中剩余的元素为:");
    tmp = L->next;
    while(tmp)
    {
        printf("%d",tmp->data);
        if(tmp->next != NULL)
            printf(" ");
        else
            printf("\n");
        tmp = tmp->next;
    }
/**************************************************************/
    //查询链表中第一个与e满足compare()关系的元素的位置,不存在则返回0
    printf("请输入要查询的元素:");
    scanf("%d",&x);
    int vis = Locate(L,x,compare);
    printf("第一个大于%d的元素的位置为:%d,值为:%d\n",x,vis,Getelem(L,vis));
/**************************************************************/
   //清空链表
   printf("执行清空链表操作!\n");
    Clear(L);
    if(Empty(L))
        printf("kong\n");
    else
        printf("No kong\n");
    printf("链表的长度为:%d\n",L->length);
/**************************************************************/
    return 0;
}
/*数据(0为结束输入的标志)
1 2 3 4 5 6 7 8 9 10 0
*/

 

链表------纯手工制造

标签:nbsp   lis   ted   compare   get   define   ace   efi   str   

原文地址:http://www.cnblogs.com/hhkobeww/p/7845746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!