带头结点链表的基本操作C/C++(头插法,尾插法,打印,查找,插入,删除)

带头结点链表的基本操作C/C++

    • 带头节点链表的基本操作
    • 测试结果展示

带头节点链表的基本操作

/**
 * 带头结点链表基本操作
 */
#include 
#include 

/**
 * 定义结构
 */
typedef struct LNode{   //定义单链表结点类型
    int data;           //数据域
    struct LNode *next; //指针域
}LNode,*LinkList;  //别名

/**
 * 打印链表数据 - 长度(单链表长度不包含头结点)
 */
void printDataAndLength(LinkList L){
    int length = 0;
    while(L != NULL){
        printf("链表的值- %d \n",L->data);
        L= L->next;
        length ++;
    }
    printf("链表的长度(不带有头结点)- %d \n",length-1);
}

/**
 *  头插法创建链表
 */
LinkList List_HeadInsert(LinkList &L){ //逆向建立单链表
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode)); //创建头结点
    L->data = 0;                       //头结点data为0
    L->next = NULL;                    //初始为空链表
    printf("请输入链表数据: \n");
    scanf("%d",&x);
    while (x!=9999){
        s=(LNode*)malloc(sizeof(LNode)); //创建新结点
        s->data = x;       //新结点 值域 赋值
        s->next = L->next; //新结点 指针域 赋值   头结点之后的一个结点插入时指针欲为null
        L->next = s;       //头结点 指针域指向新结点
        scanf("%d",&x);
    }
    return L;
}
/**
*  尾插法创建链表
*/
LinkList List_TailInsert(LinkList &L){ //顺序建立单链表
    LNode *s,*r;
    int x;
    L=(LinkList)malloc(sizeof(LNode)); //创建头结点
    L->data = 0;                       //头结点data为0
    L->next = NULL;                    //初始为空链表
    r = L;                             //尾指针指向头结点
    printf("请输入链表数据: \n");
    scanf("%d",&x);
    while (x!=9999){
        s=(LNode*)malloc(sizeof(LNode)); //创建新结点
        s->data = x;       //新结点 值域 赋值
        r->next = s;       //头结点 指针域指向新结点
        r = s;             //尾指针指向新的表尾结点
        scanf("%d",&x);
    }
    r->next = NULL;    //最后一个新结点 指针域 赋值NULL
    return L;
}

/**
 * 按序号查找结点值
 * @return
 */
LNode * getElem(LinkList L,int i){
    int j = 0;
    LNode *s = L;
    if(i == 0){
        return L;
    }
    if(i < 1 || j > i){ //校验i的合法性
        return NULL;
    }
    while(j<i){
        s = s->next;  //指针后移
        j++;
    }
    return s;
}
/**
 * 按给定值查找结点
 * @return
 */
LNode * locateElem(LinkList L,int value){
    LNode *s = L;
    while(s->data != value){
        s = s->next;  //指针后移
    }
    return s;
}

/**
 * 在第i个位置插入新结点操作
 * @return
 */
void insertByLocate(LinkList &L,int i){
    int x,j=0;
    LNode * s = getElem(L,i-1); //得到插入位置的前一位置
    LNode * newNode = (LNode *)malloc(sizeof(LNode));
    printf("输入要插入的值:");
    scanf("%d",&x);
    newNode->data = x;         //新节点赋值
    newNode->next = s->next;   //插入
    s->next = newNode;
}
/**
 * 删除第i个结点
 * @return
 */
void delNode(LinkList &L,int i){
    int j=0;
    LNode *s = getElem(L,i-1); //找到第i个结点的前驱结点
    LNode *delNode = s->next;    //删除
    s->next = delNode->next;
    free(delNode);               //释放
}
int main(){
    LinkList L;
    printf("----------创建------------ \n");
    //头插法
    //L = List_HeadInsert(L);
    //尾插法
    L = List_TailInsert(L);

    //打印
    printf("----------打印------------- \n");
    printDataAndLength(L);


    //按序号查找
    printf("----------按序号查找------------- \n");
    LNode * node = getElem(L, 3);
    printf("按序号查找到的值为 %d \n",node->data);


    //按值查找
    printf("----------按值查找------------- \n");
    LNode * lNode = locateElem(L,4);
    printf("按值查找到的值为 %d \n",lNode->data);

    printf("----------插入------------- \n");
    //在第i个位置插入新结点操作
    insertByLocate(L,4);
    printDataAndLength(L);

    //删除第i个结点
    printf("----------删除------------- \n");
    delNode(L,4);
    printDataAndLength(L);
    return 0;
}

测试结果展示

----------创建------------
请输入链表数据:
1
2
3
4
5
6
7
8
9999
----------打印-------------
链表的值- 0
链表的值- 1
链表的值- 2
链表的值- 3
链表的值- 4
链表的值- 5
链表的值- 6
链表的值- 7
链表的值- 8
链表的长度(不带有头结点)- 8
----------按序号查找-------------
按序号查找到的值为 3
----------按值查找-------------
按值查找到的值为 4
----------插入-------------
输入要插入的值:10
链表的值- 0
链表的值- 1
链表的值- 2
链表的值- 3
链表的值- 10
链表的值- 4
链表的值- 5
链表的值- 6
链表的值- 7
链表的值- 8
链表的长度(不带有头结点)- 9
----------删除-------------
链表的值- 0
链表的值- 1
链表的值- 2
链表的值- 3
链表的值- 4
链表的值- 5
链表的值- 6
链表的值- 7
链表的值- 8
链表的长度(不带有头结点)- 8

你可能感兴趣的:(数据结构)