C/C++ 知识点---链表操作

1.单链表
单链表的结点类型node定义:
typedef struct linknode
{
    int data;
    struct linknode *node;
};

<1>.建立单链表
void CreateSingleLink()
{
    node *head, *p, *s;
    int tempValue;
    bool bCycle = true; //bCycle循环控制变量

head = (node *)malloc(sizeof(node)); //建立头结点
    p = head;

while (bCycle)
    {
        scanf("%d", &tempValue);
        if (0 != tempValue) //以0标志结束
        {
            s = (node *)malloc(sizeof(node)); //建立下一个结点
            s->data = tempValue;
            p->next = s; //把新结点连接到前面建立的链表中
            p = s;
        }
        else
        {
            bCycle = false;
        }

}

p->next = NULL; //如果是循环链表,则改为p->next = head;
    p = head;
    head = head->next;    
    free(p); //删除头结点
}

<2>.单链表查找结点
bool FindNode(node *head, int iValue)
{
    bool bFind = false;
    node *p;
    //if 普通链表
    p = head;
    //else 循环列表
    //if (head->data == iValue)
    //{
    //     bFind = true;
    //     return bFind;
    //}
    //p = head->next;

while (p!=NULL && p->data!=iValue)
    {
        p = p->next;
    }

if (p != NULL)
    {
        bFind = true;
    }

return bFind;
}

<3>.单链表长度
//普通链表
int LengthLink(node *head)
{
    int iLength = 0;
    node *p;
    p = head;

while (p != NULL)
    {
        p = p->next;
        iLength++;
    }

return iLength;
}

//循环链接
int LengthLink(node *head)
{
    int iLength = 0;
    node *p;

if (head == NULL) //空链表
    {
        return iLength;
    }

p = head->next;
    iLength = 1;
    while (p != NULL)
    {
        p = p->next;
        iLength++;
    }

return iLength;
}

<4>.单链表插入结点
bool InsertNode(node *head, int i, int iValue)
{
    node *s, *p;
    int j;
    bool bInsert = false;

s = (node *)malloc(sizeof(node)); //建立待插入结点
    s->data = iValue;

if (i == 0)
    {
        //表头插入结点
        s->next = head;
        head = s;
        bInsert = true;
        return bInsert;
    }

p = head;
    j = 1;
    while (p!=NULL && j<i)
    {
        j++;
        p = p->next;
    }

if (p != NULL)
    {
        //查找成功,将s插入到其后
        s->next = p->next;
        p->next = s;
        bInsert = true;
    }

return bInsert;
}

<5>.单列表删除结点
bool DeleteNode(node *head, int iValue)
{
    node *p, *q;
    bool bDelete = false;

if (head == NULL)
    {
        //链表为空,下溢处理
        return bDelete;
    }

if (head->data == iValue)
    {
        //表头为删除结点
        p =head;
        head = head->next;
        free(p);
        bDelete = true;
        return bDelete;
     }

q = head;
    p = head->next; //从第二个结点开始查找值为iValue的结点
    while (p!=NULL && p->data!=iValue)
    {
        if (p->data != iValue)
        {
            q = p;
            p = p->next;
        }
    }

if (p != NULL)
    {
        //找到结点,作删除处理
        q->next = p->next;
        free(p);
        bDelete = true;
    }

return bDelete;
}

时间: 2024-10-23 15:47:28

C/C++ 知识点---链表操作的相关文章

数据结构上机测试2-1:单链表操作A (顺序建表+关键字删除)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

单链表操作

#include<stdio.h>#include<malloc.h> typedef struct Node{ int data; struct Node *next;}LinkList; //就地反转int LinkListRerverse(LinkList *head){ LinkList *q,*p; p = head->next; head->next = NULL; while(p != NULL){ q = p->next; p->next =

数据结构之链表操作

#include <IOSTREAM> #include <IOMANIP> #include <STRING> using namespace std; typedef struct Student { int id; char name[20]; char sex[20]; struct Student *next; }node; typedef node * pnode; pnode Create(); void Print(pnode h); void Sort

单向链表操作 原文:http://canlynet.blog.163.com/blog/static/255013652009113001041903/

/********************************************** 功能:单向链表操作(注意Head指针 需要被改变时传入的是二级指针) 日期:2009.12.29 作者:DC ***********************************************/ #include <stdio.h> #include <stdlib.h> #define OVER_FLOW -2 #define OK 0 typedef int ElemTy

单链表操作系列

#include<stdio.h> #include<stdlib.h> typedef int ElemType; //定义结点类型 typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //单链表的建立1,头插法建立单链表,逆序生成 LinkList LinkListCreateH() { LinkList L,p; L = (LinkList)malloc(sizeof(LNode)

链表操作 -- 有环链表问题

参考: http://blog.163.com/[email protected]/blog/static/1113522592011828104617420/ 问题: 判断一个链表中是否有环. 分析: 我们都知道,当一个链表中没有环时,我们使用一个指针能从头遍历到尾:当链表中有环时,链表会在环中旋转. 当我们只使用一个链表指针时,可想到方法就是使用额外的数据结构来存储遍历过的每个节点,在遍历next节点时,判断next节点是否已存在于存储的节点中. 存储结构可以选择为hashTable,这样的

C# 链表操作

关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实现了自定义链表的操作(读者可以在此基础上进一步完善).因为这段代码涉及一些C#技巧,所以贴出来给初学者学习C#提供一点参考. 实体类:     /// <summary>     /// 学生类     /// </summary>     public class Student  

链表操作 -- 问题总结贴

本文同时收集了好友 sosohu 和 zhuoyuan 的文章,共同进步.欢迎指正. 链表结构的实现: -- zhouyuan 单链表操作: (1). 倒序访问 --  sosohu (2). 获取链表的倒数第K个元素 -- sosohu    zhouyuan carlsama (3). 查找链表的中间节点 -- sosohu  carlsama (4). 链表反转 -- sosohu zhuoyuan carlsama (5). 链表中节点的删除 -- sosohu  carlsama (6

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的