单向链表

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define Status int
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define ElemType int

typedef struct Node
{
    ElemType data;
    struct Node *Next;
}Node, *LinkList;

/*头插法创建链表*/ 
void CreatListHead(LinkList *L, int n)
{
    LinkList p = NULL;
    int i;
    
    srand((unsigned)time(0));            //产生随机数种子
    
    *L = (LinkList)malloc(sizeof(Node));       //生成头结点 
    if(NULL == *L)
    {
        printf("ERROR\n");
        exit(-1);
    }
    else
    {
        (*L)->Next = NULL;         //注意->的优先级高于*,所以必须加括号 
    }
    
    for(i = 0; i < n; ++i)
    {
        p = (LinkList)malloc(sizeof(Node));
        if (NULL == p)
        {
            printf("ERROR\n");
            exit(-1);
        }
        p->data = rand()%100;        //生成0~100的随机数 
        p->Next = (*L)->Next;         //有头节点 
        (*L)->Next = p;
    }     
}

/*尾插法创建链表*/
void CreatListTail(LinkList *L, int n)
{
    int i;
    LinkList p = NULL, q = NULL;
    
    srand(time(0));
    
    *L = (LinkList)malloc(sizeof(Node));
    if(NULL == *L)
    {
        printf("ERROR\n");
        exit(-1);
    }
    else
    {
        (*L)->Next = NULL;         //注意->的优先级高于*,所以必须加括号 
    }
    q = *L;
    
    for (i = 0; i < n; ++i)
    {
        p = (LinkList)malloc(sizeof(Node));
        if(NULL == p)
        {
            printf("ERROR\n");
            exit(-1);
        }
        p->data = rand()%100;
        p->Next = q->Next;
        q->Next = p;
        q = q->Next;        
    }
}

//删除指定位置的元素 
Status ListDelete(LinkList *L,  int pos, ElemType *e)
{
    LinkList q = NULL;
    LinkList p = (*L);
    int j = 0;
    
    //判断条件不可以变为p,当删除位置为最后一个元素的下一个元素的后边的元素的时候,最终p为NULL
    //NULL->Next错误 
    while(p->Next && j < pos-1)     
    {
        p = p->Next;
        j++;
    }
    
    if(!p->Next || j > pos-1)
    {
        exit(-1);
    }
    
    (*e) = p->Next->data;
    q = p->Next;
    p->Next = q->Next;
    free(q);
    
    return OK;
}

/*遍历链表*/
void TraverseList(LinkList *L)
{
    LinkList p = (*L)->Next;
    
    while(NULL != p)
    {
        printf("%d\t", p->data);
        p = p->Next;
    }
    printf("\n");
} 

/*销毁单链表*/
void DestroyList(LinkList *L)
{
    LinkList p = *L, q = p;
    
    while(NULL != p)
    {
        q = p->Next;
        free(p);
        p = q;
    }
    
    return;
} 

/*清空单链表*/
void ClearList(LinkList *L)
{
    LinkList p = (*L)->Next;
    LinkList q = NULL;
    if (NULL == p)
    {
        return;    
    }
    else
    {
        while(NULL != p)
        {
            q = p->Next;
            free(p);
            p = q;
        }
    }
    (*L)->Next = NULL;
} 

/*头插节点*/
void InsFirst(LinkList *L, LinkList s)
{
    s->Next = (*L)->Next;
    (*L)->Next = s;
}

/*头删节点*/
void DelFirst(LinkList *L, LinkList *p)
{
    if (NULL == (*L)->Next)
    {
        return;
    }
    else
    {
        (*p) = (*L)->Next;
        (*L)->Next = (*L)->Next->Next;
    }
}

/*末尾追加*/
void AppendList(LinkList *L, LinkList s)
{
    LinkList p = (*L);
    
    while(NULL != p->Next)
    {
        p = p->Next;
    }
    
    p->Next = s;
}

/*末尾移除*/
void RemoveTailNode(LinkList *L, LinkList *P)
{
    LinkList q = *L;
    
    if(NULL == (*L)->Next)
    {
        return;
    }
    else
    {
        while(NULL != q->Next->Next)
        {
            q = q->Next;
        }
    }
    
    *P = q->Next;
    q->Next = NULL;
}

/*链表长度*/
int LengthList(LinkList *L) 
{
    int len = 0;
    LinkList p = *L;
    
    while (NULL != p->Next)
    {
        len++;
        p = p->Next;
    }
    
    return len;
}

/*判空*/ 
int Is_Empty(LinkList *L)
{
    if(NULL == (*L)->Next)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

/*指定位置插入*/
Status ListInsert(LinkList *L, int pos, ElemType e)
{
    LinkList s = NULL;
    LinkList p = (*L);
    int j = 0;                  //表示p指向第j个元素 
    
    while(p && j < pos-1)         //p最终指向第pos-1个位置的元素 
    {
        p = p->Next;
        ++j;
    }
    
    if(!p || j > pos-1)
    {
        return ERROR;
    }
    
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->Next = p->Next;
    p->Next = s;
    
    return OK;
}

/*设置第i个元素的值*/
void SetCurElem(LinkList *L, int pos, int e)
{
    int len = 0;
    LinkList p = *L;
    
    if (pos < 1 || pos > LengthList(L))
    {
        return;
    }
    else
    {
        while(len != pos)
        {
            len++;
            p = p->Next;
        }

        p->data = e;
    }
}

/*按位置查找元素*/
Status GetCurElem(LinkList *L, int pos, int *e)
{
    LinkList p = (*L)->Next;
    int j = 1;
    
    while(p && j < pos)
    {
        p = p->Next;
        ++j;
    }
    
    if(!p || j > pos)
    {
        return ERROR;
    }
    
    (*e) = p->data;
    return OK; 
}

LinkList GetElemValue(LinkList *L, int e)
{
    LinkList p = (*L)->Next;
    
    while(p && p->data != e)
    {
        p = p->Next;
    }
    return p;
}

int main(void)
{
    int e;
    LinkList L;                 //创建一个头指针 
//    LinkList p;
    CreatListHead(&L, 10);
//    CreatListTail(&L, 10);
    ListInsert(&L, 2, 9); 
    TraverseList(&L);
    ListDelete(&L, 9, &e); 
//    GetCurElem(&L, 5, &e);
    printf("位置%d\n", e);
//    printf("%d\n", GetElemValue(&L, 9)->data);    
//    AppendList(&L, s);               //每插入一个元素,新建一个结点6 
//    TraverseList(&L);
//    RemoveTailNode(&L, &p);

//    TraverseList(&L);
//    SetCurElem(&L, 5, 1000);
//    GetCurElem(&L, 5, &e);
//    TraverseList(&L);
//    printf("%d", e);
//    DelFirst(&L, &p);
//    printf("%d\n", p->data);
//    InsFirst(&L, s);
//    ClearList(&L);
    
    return 0;
}
posted @ 2019-07-13 20:12  telankesi  阅读(919)  评论(0编辑  收藏  举报