单链表的基础实现

单链表的基础实现
时间:2006/03/23
测试环境:TC2.0

#include <stdio.h>
#define LEN sizeof(struct LNode)
#define NULL 0

typedef int ElemType;

struct LNode
{
    ElemType data;
    struct LNode *next;
};

/*创建一个带空头结点的单链表*/
struct LNode *CreatList()
{
    struct LNode *head,*p,*temp;
    head = (struct LNode *)malloc(LEN);
    p = temp = (struct LNode *)malloc(LEN);
    printf("input the number:");
    scanf("%d",&p->data);
    head->next = p;
    while(p->data!=0)
    {
        p = (struct LNode *)malloc(LEN);
        printf("input the number:");
        scanf("%d",&p->data);
        temp->next = p;
        temp = p;
    }
    temp->next = NULL;
    return head;
}

/*打印出单链表*/
void Print(struct LNode *head)
{
    struct LNode *p;
    p = head->next;

    while(p->next!=NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }

}
/*销毁这个线性表*/
void DestroyList(struct LNode *head)
{
    struct LNode *p,*temp;
    p = temp = head->next;
    while(head->next!=NULL)
    {
        head->next = p->next;
        temp = p;
        free(temp);
        p = head->next;
    }
}

/*在第i个位置前插入新结点*/
void InsertList(struct LNode *head,int i)
{
    struct LNode *p,*insert;
    int count = 0;
    p = head;
    while(count<i-1 && p)
    {
        count++;
        p = p->next;
    }
    if(count>i-1 || !p)
        return;
    printf("input a number that you want to insert:");
    insert = (struct LNode *)malloc(LEN);
    scanf("%d",&insert->data);
    insert->next = p->next;
    p->next = insert;
}

/*删除第i个结点*/
void DeleteList(struct LNode *head,int i)
{
    struct LNode *p,*temp;
    int count = 0;
    p = head;
    while(count<i-1 && p)
    {
        count++;
        p = p->next;
    }
    if(count>i-1 || !p)
        return;
    temp = p->next;
    p->next = temp->next;
    free(temp);
}

void main()
{
    struct LNode *L;
    /*创建链表并打印*/
    L = CreatList();
    printf("your list is:/n");
    Print(L);
    printf("/n");
    /*在第3个结点前插入新结点,并打印*/
    InsertList(L,3);
    printf("now,your list is:/n");
    Print(L);
    printf("/n");
    /*删除第4个结点,并打印*/
    printf("delete the 4th member,");
    printf("now,your list is:/n");
    /*销毁链表,并验证是否成功*/
    DeleteList(L,4);
    Print(L);
    DestroyList(L);
    if(!L->next)
        printf("/nyour list has destroyed!");
}
时间: 2024-11-05 20:42:50

单链表的基础实现的相关文章

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

【线性表5】线性表的链式实现:循环单链表

简介 循环单链表 是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的.因此它在逻辑上是一个环形结构. 循环单链表在实际编程中很少用. 要点:1.遍历结束的标志是 p == [头结点地址],而不是p==NULL 2.表为空的判断标志是:   if( head->next == head   ) 3.在单循环链表中,从任一结点出发都可访问到表中所有结点 循环链表一般还使用尾指针rear保存最后一个结点的地址,因为使用尾指针既可以快速找到 最后一个结点,也可以快速找到头结点. 简单的代码实

c++实现双向单链表

所谓双链表就是除了头指针及尾指针以外,每个结点都有直接前驱和后继. 双链表就是在单链表的基础上加了一个前驱指针. 头指针无前驱但是有后继,尾指针有前驱但是无后继. "DList.h" #pragma once #include <iostream> using namespace std; typedef int DataType; struct Node { Node(const DataType& d)  //Node的构造函数,为Node初始化 :_data(

单链表的python实现

首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像: 链式表示指的是用一组任意的存储单元存储线性表中的数据元素,称为线性表的链式存储结构.而他既可以是连续的也可以不连续,是通过一个与后继结点的连接信息构建起来的. *顺序表(这个不是本次重点,简单介绍一下) 顺序表是用一段连续的存储单元依次存储数据元素,查找元素是很方便的,但是如果要

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点

基础数据结构——单链表

线性表根据存储结构可以分为链式存储和顺序存储. 顺序存储实际上可以理解为结构体数组,要求逻辑上相邻的元素在物理上也是相邻的: 而链式存储没有这样的要求,这样就便于元素的插入删除操作(顺序存储在插入删除操作时需要移动大量的元素). 定义单链表结点 typedef struct Node{ int element; //结点元素 struct Node* next; //结点指针 }Node,*LinkList; LinkList CreateList_head(); LinkList Create

单链表的操作和指针函数基础

/* ============================================================================ Name : TestLinkedList.c Author : lf Version : Copyright : Your copyright notice Description : 1 单链表的增删改查等操作 2 指针函数的使用.如示例中的:void (*visit)(link) ==========================

Java基础之翻转单链表

/** * @author luochengcheng * 定义一个单链表 */ class Node { //变量 private int record; //指向下一个对象 private Node nextNode; public Node(int record) { super(); this.record = record; } public int getRecord() { return record; } public void setRecord(int record) { t

算法与数据结构基础3:简单单链表List类的实现

简单的单链表实现,数据类型定义成了int,如果要通用,需要改成模板类,然后稍微修改下就可以了. // List.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class List { public: // ************************************************************************** //