数据结构导论-2.2 线性表的链式储存之单链表

线性表的链式储存之单链表

单链表的类型定义:

typedef struct node

{   DataType data; //数据域

    struct node *next; //指针域

}Node, *LinkList;

单链表举例

学生档案信息表的链接存储实现

学生档案信息链表的类型完整描述如下:

typedef struct

{   int num; //学号

    char name[8]; //姓名

    int age; //年龄

}DataType; //定义结点类型

 

typedef struct node

{  datatype data ; //数据域

   struct node *next;; //性表的实际长度

}Node, *LinkList; //Node是链表结点的类型

LinkList head;

 

单链表的初始化:

LinkList InitiateLinkList ( ) //建立一个空的单链表

{

    LinkList head; //头指针

    head= malloc(sizeof(Node)); //动态构建一结点,它是头结点;

    head->next=NULL;

    return head;

}

单链表的求表长:

int LengthLinkList1 (LinkList head)

{     Node *p=head; //p指向头结点

      int cnt=0; //计数器设初值

      while (p->next ! =NULL) //判断是否为尾结点

     {    p=p->next; //指针移到下一个结点

          cnt++;

      }

     return cnt; //返回表长

}

单链表的读表元素:

Node *GetLinkList(LinkList head, int i)

//在单链表L中查找第i个元素结点,找到返回其指针,否则返回空

{    Node *p; //p是工作指针

     p=head->next; //初始时,p指向首结点

     int c=1;

     while (( c<i ) && (p!=NULL))

       {p=p->next; c++; }

     if (c==i) return p; //找到

     else return NULL; //查找失败

}

单链表的定位:

Int LocateLinkList( LinkList head, DataType x)

//在单链表head中查找第一个值为x的结点,找到后返回其序号,否则返回0

{      Node *p=head;

       p=p->next;

       int i=0;

       while (p!=NULL && p->data!= x)

        {i++;

        p=p->next; }

       if (p!=NULL) return i+1;

       else return 0;

}

单链表的插入:

void InsertLinkList( LinkList head, DataType x, int i)

//在单链表head的第i个位置上插入值为x的元素

{ Node *p,*q;

if (i==1) q=head;

else q=GetLinkList(head, i-1); //查找第i-1个结点

if (q==NULL)

exit("找不到插入位置"); //第i-1个不存在不能插入

else

{p=malloc(sizeof(Node)); //申请、填装结点

p->data=x;

p->next=q->next; //新结点插入在第i-1个结点的后面

q->next=p;

}

}

单链表的删除:

void DeleteLinkList(LinkList head,int i)

//删除单链表head上的第i个数据结点

{ Node *q,*p

if (i==1) q=head;

else q=GetLinkList(head, i-1); //查找第i-1个结点

if (q != NULL&& q->next !=NULL)

  { p=q->next; //p指向第i个结点

    q->next=p->next; //从链表中删除p

    free(p); //释放*p

  }

else exit("第i个结点不存在");

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值