单链表的建立,插入,显示,查找删除以及反转

#include "stdafx.h"
#include <iostream>
#include <string>
#include <stack>    //二叉树遍历时使用栈
#include <queue>    //二叉树层次遍历时使用
using namespace std;

//单链表操作
class Node
{
public:
    Node *next;
    Node *front;    //双向链表时指向前驱节点的指针
    int data;
};

Node *head=NULL;    //头指针 全局变量
Node *rear=NULL;    //队列的尾指针

void create_list()
{
    Node *p1,*p2;
    int index=0;
    int data;
    while(1)
    {
        cout<<"请输入链表的第"<<++index<<"个数据(输入负数表示结束链表创建):";
        cin>>data;
        if (data<0&&index==1)    //空链表时输入负数
        {
            return;
        }
        else if (data<0)        //非空链表时输入负数
        {
            break;
        }
        p1=new Node;
        p1->data=data;
        if (index==1)            //空链表时输入有效数据
        {
            head=p1;
        }
        else
            p2->next=p1;
        p2=p1;
    }
    p2->next=NULL;
}

void show_list(Node *head)
{
    int index=0;
    Node *p=head;
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return;
    }
    while(p)
    {
        cout<<"链表的第"<<++index<<"个数据为:"<<p->data<<endl;
        p=p->next;
    }
}

int length_list(Node *head)
{
    Node *p=head;
    int length=0;
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return length;
    }
    while(p)
    {
        length++;
        p=p->next;
    }
    return length;
}

//按照位置查找数据
void find_data_list(Node *head,int pos)    //pos表示要查找的位置  从1开始算
{
    Node *p=head;
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return;
    }
    if (pos<1||pos>length_list(head))
    {
        cout<<"pos位置超出链表长度或者小于1!"<<endl;
        return;
    }
    cout<<"链表第"<<pos<<"个位置的值为:";
    while(--pos)
    {
        p=p->next;
    }
    cout<<p->data<<endl;
}

//按照数据查找位置
void find_pos_list(Node *head,int data)
{
    Node *p=head;
    int pos=0;        //记录数据在链表中的位置
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return;
    }
    while(p)
    {
        pos++;
        if (p->data==data)
        {
            cout<<data<<"在链表的第"<<pos<<"个位置"<<endl;
            return;
        }
        p=p->next;
    }
    cout<<data<<"不在链表中"<<endl;
}

//删除指定位置的数据
void delete_pos_list(Node *head,int pos)
{
    Node *p=head;
    Node *temp;
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return ;
    }
    if (pos<1||pos>length_list(head))
    {
        cout<<"pos位置超出链表长度或者小于1!"<<endl;
        return ;
    }

    if (pos==1)        //删除头结点
    {
        ::head=head->next;    //更新全局头指针
        delete p;
        p=NULL;
    }
    else
    {
        pos=pos-1;    //保证while循环找到的是pos结点的上一个结点
        while(--pos)    //循环结束时p指向pos位置的上一个位置
        {
            p=p->next;
        }
        temp=p->next;
        p->next=p->next->next;
        //p=temp->next;
        delete temp;
        temp=NULL;
    }
}

//在pos位置插入一个元素  插入在pos-1位置后面
void insert_pos_list(Node *head,int pos,int data)
{
    Node *temp;
    Node *p=head;
    if (head==NULL)
    {
        cout<<"链表为空!"<<endl;
        return ;
    }
    if (pos<1||pos>length_list(head))
    {
        cout<<"pos位置超出链表长度或者小于1!"<<endl;
        return ;
    }
    if (data<0)
    {
        cout<<"插入的数据小于0!"<<endl;
        return ;
    }
    if (pos==1)    //插入的头结点
    {
        temp=new Node;
        temp->data=data;
        temp->next=head;
        ::head=temp;
    }
    else
    {
        pos=pos-1;
        while(--pos)    //while循环结束时p指针指向pos-1个位置
        {
            p=p->next;
        }
        temp=new Node;
        temp->data=data;
        temp->next=p->next;
        p->next=temp;
    }
}

void reverse_list(Node *head)        //翻转单链表
{
    Node *p1,*p2,*p3;                //借助三个指针完成链表节点的依次反转  指向反转
    if (head==NULL||head->next==NULL)    //头结点为空 或者 只有头结点而没有其他节点  此时直接返回空
    {
        cout<<"链表为空或只有头结点而无其他数据节点!"<<endl;
        return ;
    }

    p1=head;                        //p1保存头结点地址
    p2=head->next;                    //
    head->next=NULL;
    while(p2)
    {
        p3=p2->next;                //p3保存剩下的旧的链表
        p2->next=p1;
        p1=p2;                        //指针依次后移
        p2=p3;
    }
    ::head=p1;                        //更新全局head指针
}

//找出单链表的中间元素
Node *search_middle(Node *head)
{
    if (head==NULL)
    {
        cout<<"链表为空"<<endl;
        return NULL;
    }
    Node *p;
    p=head;
    int i=0,j=0;
    Node *mid;
    mid=head;
    while(p)
    {
        if (i/2>j)
        {
            j++;
            mid=mid->next;
        }
        i++;
        p=p->next;
    }
    return mid;
}

//创建环形链表(单向)
//参数n表示有n个人围成的的环
void create_sysle_list(int n)
{
    if (n<1)
    {
        cout<<"参数错误,人数不能小于1"<<endl;
        return;
    }
    Node *p1,*p2;
    int index=0;    //计数
    while(index++<n)
    {
        p1=new Node;
        p1->data=index;
        if (index==1)    //头结点
        {
            head=p1;
            p1=p1->next;
        }
        else
            p2=p1;
        p2=p1;
    }
}单链表的反转,图解理解是最好的了,参考网址http://www.2cto.com/kf/201110/106607.html
时间: 2024-12-29 15:14:57

单链表的建立,插入,显示,查找删除以及反转的相关文章

C 动态链表的建立,输出,删除,插入

动态链表的建立,输出,删除,插入 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct student*next; }; int n;/*n为全局变量*/ struct student *creat() { struct

单向链表的建立,添加与删除

/*-------------------------包含头文件------------------------------------*/ #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> int count=0; /*-------------------------结构体定义部分------------------------------*/ typed

单链表(建立、插入、删除、打印)

单向链表创建 链表是动态分配存储空间的链式存储结构. 其包括一个"头指针"变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址. 链表中每一个元素称为"结点",每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域.指针域中存储的即是链表的下一个结点存储位置,是一个指针.多个结点链接成一个链表. 最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没

单链表的建立和增删改查代码及讲解

//---单链表的单链式存储结构---- typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //1.初始化 int Initlist(LinkList L) { L=NULL; return OK; } //初始化(带头结点) int Initlist(LinkList L) { L=(LNode*)malloc(sizeof(Lnode));//为头结点分配内存空间 L->next=NULL;

单链表的经典操作,查找链表倒数第k个节点,判断链表是否存在环,求环节点

#include<stdio.h>#include<stdlib.h> typedef struct date_list{    int data;    struct date_list* next;}mylist; mylist* creatlist(int x,mylist* p)        //用一个元素创建链表{    if(NULL == p)                         //链表创建必须判空    {        p = malloc(siz

数据结构-编程实现一个单链表节点的插入

1:向链表中某个位置(第pos个节点)之后插入节点,这里分别插入到链表首部.插入到链表中间,以及链表尾端3个位置.代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;/

单链表的建立与打印

建立单链表,并且从头到尾打印单链表 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> typedef int DataType; typedef struct LinkNode { DataType data;//定义节点的数据 struct LinkNode *next;//保存下一个节点的地址 }LinkNode,*pList,*pLin

C语言实现单链表的节点插入(带头结点)

我在之前一篇博客<C语言实现单链表(不带头结点)节点的插入>中具体实现了怎样在一个不带头结点的单链表中进行节点的插入.可是在实际应用中,带头结点的链表更为经常使用.更为方便.今天我们就要来使用带头结点的单链表进行节点的插入.演示样例代码上传至 https://github.com/chenyufeng1991/InsertList_HeadNode  . 核心代码例如以下: Node *InsertNode(Node *pNode,int pos,int x){ int i = 0; Node

单链表的建立/测长/打印

#include<iostream> #include<stdio.h> #include<string.h> #include<conio.h> using namespace std; typedef struct student { int data; struct student *next; }node; node *creat() { node *head, *p, *s; int x, cycle = 1; head = (node*)mall