鱼C论坛

 找回密码
 立即注册
查看: 3033|回复: 3

[技术交流] linux 环境下单链表的定义及简单应用实现

[复制链接]
发表于 2015-12-2 12:46:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

刚开始学习 希望多多交流



#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-12 15:56:48 | 显示全部楼层
路过  看看   。。。。谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-24 00:49:41 | 显示全部楼层
加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-14 15:08:59 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 16:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表