Dancersky 发表于 2015-12-2 12:46:36

linux 环境下单链表的定义及简单应用实现


刚开始学习 希望多多交流



#include <stdio.h>
#include <stdlib.h>

typedef int DataType;         //定义一个结点结构体
typedef struct Node
{
        DataType data;
        struct Node *next;
}LNode;

void ListInitiate(LNode **head)       //单链表初始化
{
        *head = (LNode *)malloc(sizeof(LNode));   //申请头节点 ,head指示其地址
        (*head)->next = NULL;                     //将头指针next置空
}

int ListLength(LNode *head)      //求链表数据元素个数
{
        LNode *p;            
        int length = 0;
        p = head;
        while(p->next != NULL)
        {
                p = p->next;
                length++;
        }
        return length;               //返回length的大小
}

int ListInsert(LNode *head,int i,DataType x)   //单链表插入一个结点
{
        LNode *p,*q;
        int j = -1;

        p = head;
        while(p->next != NULL && j < i-1)         //遍历到指向i-1的结点
        {
                p = p->next;
                j ++;
        }
       
        if(j != i-1)
        {
                printf("iput i error..\n");
                return 0;
        }
        q = (LNode *)malloc(sizeof(LNode));         //生成新结点
        q -> data = x;                              //新结点数据赋值

        q->next = p->next;      //新结点指针指向原来链表指向的下一个结点
        p->next = q;               //i-1结点指针指向i结点变为指向新结点,完成插入

        return 1;
}

int ListDelete(LNode *head,int i,DataType *x)//删除第i个结点
{
        LNode *p,*q;
        int j = -1;

        p = head;

        while(p->next != NULL && p->next->next != NULL && j < i-1)//遍历链表
        {
                p = p->next;
                j ++;
        }
        if(j != i-1)
        {
                printf("delete error..\n");
                return 0;
        }

        q = p->next;            //将p指向的下一个结点赋给q
        p->next = q->next;      //将p指向下一个结点变为指向下下个结点
    *x = q->data;             //将q中数据赋值给*x
        free(q);                  //释放掉q结点
        return 1;
}

int ListGet(LNode *head,int i,DataType *x)//取链表元素
{
        LNode *p;
        p = head;
        int j = -1;
        while(p->next != NULL && j < i)
        {
                p = p->next;
                j ++;
        }
        if(j != i)
        {
                printf("get error...\n");
                return 0;
        }

        *x = p->data;               //将第i个结点数据元素赋值给x
        return 1;
}

void ListDestroy(LNode **head)//链表销毁
{
        LNode *p,*q;
        p = *head;

        while(p != NULL)
        {
                q = p;
                p = p->next;
                free(q);      //释放结点空间
        }
        *head = NULL;      //头指针置空
}

int main()
{
        LNode *head;
        int i,x;

        ListInitiate(&head);                         //链表初始化
        for(i = 0; i < 10 ; i ++)
        {
                ListInsert(head,i,i+1);            //插入数据元素
        }
        ListDelete(head,4,&x);                   //删除数据元素
        for(i = 0 ; i < 9 ;i ++)
        {
                ListGet(head,i,&x);                  //取数据元素
                printf("%d\t",x);
        }
        printf("\n");
        ListDestroy(&head);                     //销毁链表
        return 0;
}

gt3223 发表于 2015-12-12 15:56:48

路过看看   。。。。谢谢分享

SDULZY 发表于 2016-2-24 00:49:41

加油!

zhouxcpython 发表于 2016-6-14 15:08:59

感谢分享
页: [1]
查看完整版本: linux 环境下单链表的定义及简单应用实现