数据结构-单链表基础操作

1 头插法建立单链表(带头结点):

LinkList List_HeadInsert(LinkList &L){      //逆向建立单链表
    LNode *s; int x;                        
    L = (LinkList)malloc(sizeof(LNode));    //创建头结点
    L->next = NULL;                         //初始化空链表
    scanf("%d", &x);                        //输入结点的值
    while(x != 9999){                       //输入9999表示结束
        s = (LNode*)malloc(sizeof(LNode));  //创建新结点
        s->data = x;
        s->next = L->next;
        L->next = s;                        //将新结点插入表中,L为头指针
        scanf("%d", &x);    
    }
    return L;
}

(不带头结点)

LinkList List_HeadInsert(LinkList &L){      //逆向建立单链表
    LNode *s; int x;                        
    L = NULL;                               //初始化空链表
    scanf("%d", &x);                        //输入结点的值
    while(x != 9999){                       //输入9999表示结束
        s = (LNode*)malloc(sizeof(LNode));  //创建新结点
        s->data = x;
        s->next = L;
        L = s;                              //将新结点插入表中,L为头指针
        scanf("%d", &x);    
    }
    return L;
}

2 尾插法建立单链表(带头结点)

LinkList List_TailInsert(LinkList &L){        //正向建立单链表
    int x;                                    //设置元素类型为整型
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;                     
    LNode *s,*r = L;                          //r为表尾指针
    scanf("%d", &x);                          //输入结点的值
    while(x != 9999){                        //输入9999表示结束
        s = (LNode *)malloc(sizrof(LNode));  
        s->data = x;
        r->next = s;
        r = s;                                //r指向新的表尾结点
        scanf("%d", &x);    
    }
    r->next = NULL;                           //尾结点指针置空
    return L;
}

(不带头结点)

LinkList List_TailInsert(LinkList &L){        //正向建立单链表
    int x;                                    //设置元素类型为整型
    L = NULL;                     
    LNode *s,*r = NULL;                       //r为表尾指针
    scanf("%d", &x);                          //输入结点的值
    while(x != 9999){                        //输入9999表示结束
        s = (LNode *)malloc(sizrof(LNode));  
        s->data = x;
        if(r == NULL){
            L = s;
            r = s;
        }
        else{
            r->next = s;
            r = s;                            //r指向新的表尾结点
        }                            
        scanf("%d", &x);    
    }
    r->next = NULL;                           //尾结点指针置空
    return L;
}

3 按序号查找结点值

LNode *GetElem(LinkList L, int i){
    int j = 1;                       //计数,初始为1
    LNode *p = L->next;              //头结点指针赋给p
    if(i == 0){
        return L;                    //若i等于0,则返回头结点
    }
    if(i < 1){
        return NULL;                 //若i无效,则返回NULL
    }
    while(p && j < i){               //从第1个结点开始找,查找第i个结点
        p = p->next;
        j++;
    }
    return p;                        //返回第i个结点的指针,若i大于表长,则返回NULL
}

4 按值查找表结点

LNode *LocateElem(LinkList L,ELemType e){
    LNode *p = L->next;
    while(p != NULL && p->data != e){        //从第1个结点开始查找data为e的结点
        p = p->next;
    }
    return p;                                //找到后返回该节点指针,否则返回NULL
}

5 插入结点(带头结点)

bool ListInsert(LinkList &L, int i, ElemType e){
    if(i < 1)
        return false;
    LNode *p;                                      //指针p指向当前扫描到的结点
    int j = 0;                                     //当前p指向的是第几个结点
    p = L;                                         //L指向头结点,头结点是第0个几点
    while(p != NULL && j < i-1){                   //循环找到第i-1个结点
        p = p->next;
        j++;
    }
    if(p == NULL)                                  //i值不合法
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    s->data = a;
    s->next = p->next;
    p->next = s;                                   //将结点s连到p之后
    return true;                                   //插入成功
}

(不带头结点)

bool ListInsert(LinkList &L, int i, ElemType e){
    if(i < 1)
        return false;
    if(i == 1){                                    //插入第1个结点的操作与其他结点操作不同
        LNode *s = (LNode *)malloc(sizeof(LNode));
        s->data = e;
        s->next = L;
        L = s;                                     //头指针指向新结点
        return true;
    }
    LNode *p;                                      //指针p指向当前扫描到的结点
    int j = 0;                                     //当前p指向的是第几个结点
    p = L;                                         //L指向头结点,头结点是第0个几点
    while(p != NULL && j < i-1){                   //循环找到第i-1个结点
        p = p->next;
        j++;
    }
    if(p == NULL)                                  //i值不合法
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    s->data = a;
    s->next = p->next;
    p->next = s;                                   //将结点s连到p之后
    return true;                                   //插入成功
}

6 指定结点的前插

bool InsetPriorNode(LNode *p, ElemType e){
    if(p == NULL)
        return false;
    LNode *s = (LNode *)malloc(sizeof(LNode));
    if(s == NULL)                                //内存分配失败
        return false;
    s->next = p->next;
    p->next = s;                                 //将结点s连到p之后
    s->data = p->data;                           //将p中元素复制到s中
    p->data = e;                                 //p中元素覆盖为e
    return true;
}

7 删除结点(带头结点)

bool ListDelete(LinkList &L, int i, ElemType &e){
    if(i < 1)
        return false;
    LNode *p;                                 //当前指针扫描到的结点
    int j = 0;                                //当前p指向的是第几个结点
    p = L;                                    //L指向头结点,头结点是第0个节点
    while(p != NULL && j < i-1){              //循环找到第i-1个结点
        p = p->next;
        j++;
    }
    if(p == NULL)                             //i值不合法
        return false;
    if(p->next == NULL)                       //第i-1个结点之后已无其他结点
        return false;
    LNode *q = p->next;                       //令q指向被删除结点
    e = q->data;                              //用e返回元素的值
    p->next = q->next;                        //讲*q结点从链中断开
    free(q);                                  //释放结点的存储空间
    return true;                              //删除成功
}

(不带头结点)

bool ListDelete(LinkList &L, int i, ElemType &e){
    if(i < 1)
        return false;
    if(i == 1){
        LNode *q = L;
        L = q->next;
        e = q->data;
        free(q);
        return true;
    }
    LNode *p;                                 //当前指针扫描到的结点
    int j = 0;                                //当前p指向的是第几个结点
    p = L;                                    //L指向头结点,头结点是第0个节点
    while(p != NULL && j < i-1){              //循环找到第i-1个结点
        p = p->next;
        j++;
    }
    if(p == NULL)                             //i值不合法
        return false;
    if(p->next == NULL)                       //第i-1个结点之后已无其他结点
        return false;
    LNode *q = p->next;                       //令q指向被删除结点
    e = q->data;                              //用e返回元素的值
    p->next = q->next;                        //讲*q结点从链中断开
    free(q);                                  //释放结点的存储空间
    return true;                              //删除成功
}

8 求表长(带头结点)

int Length(LinkList L){
    int len = 0;              //统计表长
    LNode *p = L; 
    while(p->next != NULL){
        p = p->next;
        len++;   
    }
    return len;
}

(不带头结点)

int Length(LinkList L){
    int len = 0;              //统计表长
    LNode *p = L; 
    if(p == NULL){            //表为空
        return len;
    }
    while(p != NULL){
        p = p->next;
        len++;   
    }
    return len;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。C语言中实现单链表的基本操作包括:创建链表、插入节点、删除节点、查找节点、遍历链表等。其中,插入节点和删除节点是单链表的核心操作。在插入节点时,需要先找到要插入位置的前一个节点,然后将新节点插入到该节点之后;在删除节点时,需要先找到要删除节点的前一个节点,然后将该节点从链表中删除。以下是单链表的基本操作代码示例: 1. 创建链表 ``` LinkList CreateList() { LinkList L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; return L; } ``` 2. 插入节点 ``` bool ListInsert(LinkList L, int i, ElemType e) { if (i < 1) { return false; } LNode *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL) { return false; } LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return true; } ``` 3. 删除节点 ``` bool ListDelete(LinkList L, int i, ElemType &e) { if (i < 1) { return false; } LNode *p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL || p->next == NULL) { return false; } LNode *q = p->next; e = q->data; p->next = q->next; free(q); return true; } ``` 4. 查找节点 ``` LNode *GetElem(LinkList L, int i) { if (i < 1) { return NULL; } LNode *p = L->next; int j = 1; while (p != NULL && j < i) { p = p->next; j++; } return p; } ``` 5. 遍历链表 ``` void TraverseList(LinkList L) { LNode *p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值