码迷,mamicode.com
首页 > 其他好文 > 详细

01-- 数据结构——动态链表

时间:2016-04-19 13:58:47      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。

技术分享

#include <stdio.h>  
#include <malloc.h>  
  
const int OK = 1;  //定义正确返回  
const int ERROR  = -1;  //定义错误的返回  
const int OVERFLOW = -2; //定义溢出  
  
//定义元素类型  
typedef int ElemType;  
//定义返回类型  
typedef int Status;  
  
typedef struct LNode{  
    ElemType data;  
    struct LNode *next;  
}LNode, *LinkList;  
  
//获取第i个元素(L为带头结点的单链表的头指针)  
Status GetElem_L(LinkList L, int i, ElemType &e){  
    LinkList p = L->next; //L->next指向头结点  
    int j = 1;  
    while(p&&j<i){  
        p = p->next;  
        ++j;  
    }  
    if(!p || j>i) return ERROR;  
    e = p->data;  
    return OK;  
}  
  
//插入元素(第i个位置之前插入元素)  
Status ListInsert_L(LinkList L, int i, ElemType &e){  
    LinkList p = L; //头结点  
    int j = 0;  
    while(p && j<i-1){  
        p = p->next;  
        ++j;  
    }  
    if(!p || j>i-1) return ERROR;  
    LinkList s = (LinkList)malloc(sizeof(LNode));  
    s->data = e;  
    s->next = p->next;  
    p->next = s;  
    return OK;  
}  
  
//删除第i个元素  
Status ListDelete_L(LinkList &L, int i, ElemType &e){  
    LinkList p = L; //p指针指向头结点  
    int j = 0;   
    while(p && j<i-1){  
        p = p->next;  
        ++j;  
    }  
    if(!p || j>i-1) return ERROR;  
    LinkList s = p->next;  
    p->next = s->next;  
    e = s->data;  
    free(s);  
    return OK;  
}  
  
  
//创建链表,并添加n个数据结点  
void CreateList_L(LinkList &L, int n){  
    L = (LinkList)malloc(sizeof(LNode));  
    L->next = NULL;  //创建一个带头结点的单链表  
    int i;  
    LinkList p;  
    for(i=n;i>0;--i){  
        p = (LinkList)malloc(sizeof(LNode));  
        printf("请输入链表第%d个元素的数据:\n", i);  
        scanf("%d", &p->data);  
        p->next = L->next; //头插法  
        L->next = p;  
    }  
}  
  
//遍历链表  
void ShowList_L(const LinkList &L){  
    LinkList p = L->next;  
    int j = 1;  
    while(p){  
        printf("链表的第%d个元素是%d\n", j, p->data);  
        p = p->next;  
        ++j;  
    }  
}  
  
int main(){  
    LinkList L;  
    printf("============创建5个数据结点============\n");  
    CreateList_L(L, 5);  
    ShowList_L(L);  
    printf("============删除了第5个元素============\n");  
    ElemType e;  
    ListDelete_L(L, 5, e);  
    ShowList_L(L);  
    printf("============添加第5个元素=============\n");  
    ListInsert_L(L, 5, e);  
    ShowList_L(L);  
  
    scanf("%d");  
    return 0;  
}  

 

部分说明:

 

1、第i个元素之前插入元素

技术分享

如上图所示,假如现在有4个元素,那么有四个可选插入位置(①②③④):

让p先指向头结点,我们需要找到第i-1个结点,也就是需要插入位置的前一个结点,比如我们要插入到i=3,那么需要找到2位置,插入到③位置。

01-- 数据结构——动态链表

标签:

原文地址:http://www.cnblogs.com/wohenben/p/5407859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!