单链表(建立、插入、删除、排序、逆置、打印)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
using namespace std;

typedef struct student
{
    int data;
    struct student *next;
}node;

node * creat(void)
{
    node *head,*p,*s;
    int x,cycle=1;
    head=(node*)malloc(sizeof(node));
    p=head;
    while(cycle)
    {
        printf("\nplease input the data( 0 means stop ):");
        scanf("%d",&x);
        if(x)
        {
            s=(node *)malloc(sizeof(node));
            s->data=x;
            printf("\n%d",s->data);
            p->next=s;
            p=s;
        }
        else cycle=0; //input x=0,then cycle=0,the for cycle is over;
    }
    head=head->next; //remove header
    p->next=NULL;
return head;
}

int length(node *head) //measuring the length of list
{
    int n=0;
    node *p;
    p=head;
    while(p)
    {
        p=p->next;
        n++;
    }
    return n;
}

int print(node *head) //print the list
{
    node *p;
    int n=0,i=1;
    n=length(head);
    printf("\nNow.These %d records are: ",n);
    p=head;
    if(!head) return -1;
    while(p)
    {
        printf("\n %d   ",p->data);
        p=p->next;
    }
}

node * del(node *head,int num)  //delete the node whose data == num
{
    node *p1,*p2;
    p1=head;
    while(num!=p1->data && p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(num == p1->data)
    {
        if(p1 == head)
        {
            head=p1->next;
            free(p1);
        }
        else
            p2->next=p1->next;
    }
    else
        printf("\n%d could not been found",num);
    return head;
}

node * insert(node *head,int num)
{
    node *p0,*p1,*p2;
    p1=head;
    p0=(node *)malloc(sizeof(node));
    p0->data=num;
    while(p0->data > p1->data && p1->next != NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(p0->data <= p1->data)
    {
        if(head == p1)
        {
            p0->next=p1;
            head=p0;
        }
        else
        {
            p0->next=p1;
            p2->next=p0;
        }
    }
    else
    {
        p1->next=p0;
        p0->next=NULL;
    }
    return head;
}

node * sort(node *head)
{
    node *p,*p2,*p3;
    int n,temp;

    n=length(head);
    if(head==NULL || head->next==NULL)
        return head;
    p=head;
    for(int j=1;j<n;++j)
    {
        p=head;
        for(int i=0;i<n-j;++i)
        {
            if(p->data > p->next->data)
            {
                temp = p->data;
                p->data = p->next->data;
               p->next->data = temp;
            }
            p = p->next;
        }
    }
    return head;
}

node * reverse (node *head)
{
    node *p1,*p2,*p3;
    if(head==NULL || head->next==NULL)
        return head;
    p1 = head;
    p2 = p1->next;
    while(p2)
    {
        p3 = p2->next;
        p2->next = p1;
        p1=p2;
        p2=p3;
    }
    head->next = NULL;
    head=p1;
    return head;
}

int main (int argc, char **argv)
{
    node *head;
    int num,n;
    while(1)
    {
        printf("\n----------------");
        printf("\n******Menu******|");
        printf("\n0:exit          |");
        printf("\n1:cerat list    |");
        printf("\n2:delete a node |");
        printf("\n3:insert a node |");
        printf("\n4:print list    |");
        printf("\n5:sort list     |");
        printf("\n6:reverse list  |");
        printf("\n----------------");
        printf("\n please chose your number listed above: ");
        scanf("%d",&num);
        switch(num)
        {
            case 0: return 0;
            case 1: head=creat(); break;
            case 2: printf("\nchose the number you want delete: ");
                    scanf("%d",&n);
                    head=del(head,n);
                    break;
            case 3: printf("\nchose the number you want insert: ");
                    scanf("%d",&n);
                    head=insert(head,n);
                    break;
            case 4: print(head); break;
            case 5: head=sort(head); break;
            case 6: head=reverse(head); break;
        }
    }
}
时间: 2024-10-08 10:28:14

单链表(建立、插入、删除、排序、逆置、打印)的相关文章

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi

单链表的插入 删除 及带环 问题

#include<stdio.h> #include<assert.h> #include<malloc.h> #include<stdlib.h> typedef int Datatype; typedef struct SListNode { Datatype data; struct SListNode*next; }SListNode; void Erase(SListNode*&pHead, SListNode *pos); void Pu

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看. 链表创建: 1.先建立一个不含数据的头指针*head,头指针的链接域为NULL. 2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head. 3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc. #define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误

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

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()

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

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

单链表顺序插入

向单链表中插入新元素,并保证插入后,元素是有序的. [程序实例] 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 bool sll_insert(ListNode **root, int value) 8 { 9 ListNode *PrevNode =NULL; 10 ListNode *Current = *root; 11 12 while (Current!=NULL && Current->val<

单链表实现“插入”和“删除”操作

在单链表中,又如何实现"插入"和"删除"操作呢? 插入操作: 假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针.为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中.根据插入操作的逻辑定义,还需修改结点a中的指针域,令其指向结点x,而结点x中的指针域应该指向b结点,从而实现3个元素a,b和x之间逻辑关系的变化. 假设s为指向结点x的指针.则上述指针修改用语句描述即为: s->next=p-

单链表的插入伪算法和用C语言创建单链表,并遍历

非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p->pNext = q; // q保存了那一块结点的地址.q是一个指针变量,存放那个结点的地址.q->pNext = r; 第二种表示方法:q->pNext = p->pNext; // q的指针域指向p后面一个结点p->pNext = q; // p的指针域指向q 删除非循环单链表结点

双链表建立和删除

#include<iostream> #include<cstring> #include<cstdio> #include<stdlib.h> using namespace std; typedef struct student { int data; struct student*next; struct student *pre; }dnode; dnode*creat()//双链表的建立 { dnode *head,*p,*s; int x,cyc