zoukankan      html  css  js  c++  java
  • 线性表的链式存储结构(带头结点的单链表)

    首先,我们定义带头节点的单链表存储结构如下:

    1 /*
    2 ** 线性表的单链表存储结构定义 */
    3 typedef int ListElemType;//线性表数据元素类型
    4 typedef struct tagLNode {
    5     ListElemType data;
    6     struct tagLNode *next;
    7 }LNode, *LinkList;

    在此基础上可以执行的基本操作如下:

     1 #include "linklist_algo.h"
     2 #include <stdlib.h>
     3 
     4 /*
     5 ** 初始化单链表
     6 */
     7 void LinkList_Init(LinkList *list)
     8 {
     9     *list = (LinkList)malloc(sizeof(LNode));
    10     if (!*list) exit(EXIT_FAILURE);
    11     (*list)->data = 0;
    12     (*list)->next = NULL;//头结点的指针域为空
    13 }
    14 
    15 /*
    16 ** 插入
    17 */
    18 int LinkList_Insert(LinkList list, int index, ListElemType e)
    19 {
    20     int i = 0;//计数器初值为0
    21     LinkList node = NULL, p = list;//p指向头结点
    22     while (p && i < index-1){//寻找第iindex-1个结点
    23         i++; p = p->next;
    24     }
    25     if (i > index-1 || !p) return 0;//第index-1个结点不存在
    26     node = (LinkList)malloc(sizeof(LNode));
    27     if (!node) return -1;
    28     //在第index元素之前插入新结点
    29     node->data = e;
    30     node->next = p->next;
    31     p->next = node;
    32     return 1;
    33 }
    34 
    35 /*
    36 ** 读取元素
    37 */
    38 int LinkList_GetElem(LinkList list, int index, ListElemType *elem)
    39 {
    40     int i = 1;//计数器初始化为1
    41     LinkList p = list->next;//p指向第1个结点
    42     while (p && i < index){//寻找第index个结点
    43         i++; p = p->next;
    44     }
    45     if (!p || i > index) return 0;
    46     *elem = p->data;
    47     return 1;
    48 }
    49 
    50 /*
    51 ** 删除
    52 */
    53 int LinkList_Delete(LinkList list, int index, ListElemType *e)
    54 {
    55     int i = 0;//计数器初值为0
    56     LinkList q, p = list;//p指向头结点
    57     while (p->next && i < index-1){
    58         i++; p = p->next;//寻找第index-1个结点
    59     }
    60     if (i > index-1 || !p->next) return 0;//删除位置不合法
    61     q = p->next;//q指向待删除结点,p指向待删除结点的前驱
    62     *e = q->data;
    63     p->next = q->next;//断开待删除结点与线性表的连接
    64     free(q);//释放被删除结点的内存
    65     return 1;
    66 }

    最后,附上测试程序:

     1 #include <stdio.h>
     2 #include "linklist_algo.h"
     3 
     4 void visit(ListElemType e)
     5 {
     6     printf(" %d ", e);
     7 }
     8 
     9 int compare(ListElemType e1, ListElemType e2)
    10 {
    11     if (e1 == e2) return 1;
    12     return 0;
    13 }
    14 
    15 //For Test
    16 int main(int argc, char **argv)
    17 {
    18     LinkList List;
    19     ListElemType e;
    20     int i = 0, index;
    21     
    22     LinkList_Init(&List);//初始化空表
    23     //插入元素
    24     LinkList_Insert(List, 1, 11);
    25     LinkList_Insert(List, 2, 22);
    26     LinkList_Insert(List, 1, 33);
    27     //读取元素
    28     if (LinkList_GetElem(List, 2, &e)){
    29         printf("Get 2-th Element : %d
    ", e);
    30     }
    31     //删除结点
    32     if (LinkList_Delete(List, 3, &e)){
    33         printf("Delete 3rd : %d
    ", e);
    34     }
    35 
    36     return 0;
    37 }
  • 相关阅读:
    如何招到一个靠谱的程序员_转
    区块链blockchina简述
    TCP和UDPsocket中SO_SNDBUF和SO_RCVBUF_转
    Medium开发团队谈架构设计_转
    cgi与fastcgi区别_转
    RESTful
    各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT_转
    mosquitto简单应用
    组播MAC地址_转
    纳德拉再造微软:如何重回第一阵营?
  • 原文地址:https://www.cnblogs.com/xiaomanon/p/4509981.html
Copyright © 2011-2022 走看看