单向链表程序

 

 

 

/*****************************************************************************
*                                    程序说明
*            程序名称:简单单向链表
*
*            功能:    实现单向链表的创建、插入、删除、遍历和查找
*
*            作者:    Veis
*
*            注:此代码已在VC6.0及VS2010环境下编译通过,能正常实现所对应的功能
*            程序元素排序与数组下标一样,从0开始。
******************************************************************************/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>

//宏定义数组大小,便于修改
#define N 10        

struct student
{
    char name[20];                //数据域
    struct student *next;        //指针域
};
//判断查找和删除时对应位置的内容是否为空
bool judge(struct student *p, int position)
{
    int count;
    
    //初始化很重要
    count = 0;

    while( NULL != p )
    {
        p = p->next;
        count++;
    }
    //    printf("count:%d\n",count);
    if( position > (count - 1) )
    {
        return false;
    }else 
    {
        return true;
    }
}
//创建链表
struct student * create()
{
    // head链表的头指针,即链表的首地址
    // current当前处理的元素
    //next下一个状态的指针
    struct student *current, *head, *next;
    char str[N];
    char flag;
    
    //提示用户输入信息
    printf("请输入学生姓名:\n");
    scanf("%s",str);
    
    //动态申请内存
    head = (struct student *)malloc(sizeof(struct student));
    //字符串之间不能直接复制,需要调用字符串处理函数strcpy,包含在库string.h
    strcpy( head->name , str );

    //把链表的头指针赋给当前状态指针
    current = head;
    
    //输入y/n
    printf("是否继续输入?");
    scanf("%s",&flag);

    //排除回车符的干扰
    getchar();            

    while(flag != 'n')
    {
        //提示用户输入信息
        printf("请输入学生姓名:\n");
        scanf("%s",str);

        //动态申请内存
        next = (struct student *)malloc(sizeof(struct student));
        
        //判断是否分配内存成功
        if( NULL == next )
        {
            printf("Error:内存分配失败!");
            //退出程序,作用和 return 相似
            exit(-1);        
        }
        strcpy( next->name , str );

        //把当前状态指针的下一个指向下一个链表
        current->next = next;

        //把当前状态指针指往后移一个
        current = next;
    
        printf("是否继续输入?");
        scanf("%s",&flag);

        //排除回车符的干扰
        getchar();    
    }

    //输入完成后把当前状态指针的下一个状态指向NULL
    current->next = NULL;

    return head;
}

// 遍历链表
void list(struct student *p)
{
    while(1)
    {
        printf("%s \n", p->name);

        if( p->next != NULL )
        {
            p = p->next;
        }else
        {
            break;
        }
    }
}

//插入元素到链表
void insert(struct student *p)
{
    // insert要插入的元素
    // current当前处理的元素
    struct student *insert, *current;
    char str[N];
    int position;

    current = p;

    printf("请输入需要插入的学生姓名:\n");
    scanf("%s",str);
    
    //动态申请内存
    insert = (struct student *)malloc(sizeof(struct student));

    //判断是否分配内存成功
    if( NULL == insert )
    {
        printf("Error:内存分配失败!");
        exit(-1);
    }
    strcpy( insert->name , str );
loop:
    printf("请输入需要插入的位置:\n");
    scanf("%d",&position);

    
    //查询并判断元素插入位置
    if( position > 0 )
    {
        while( position > 1 )
        {
            current = current->next;
            position--;
        }
        //插入的元素指向当前元素的下一个
        insert->next = current->next;

        //当前元素的下一个指向插入的元素
        current->next = insert;
    }
    else if( position == 0 ) 
    {
        p = insert;
        insert->next = current;
    }
    else 
    {
        printf("\nError:输入错误!\n");
        goto loop;
    }
    list(p);
}
//删除链表元素
void delet(struct student *p)
{
    // insert用来保存要删除的元素
    // current当前处理的元素
    struct student *current, *delet;
    int position;

    current = p;
    delet = current;
loop:
    printf("请输入需要删除的位置:\n");
    scanf("%d",&position);
    
    if( judge(p,position) == true)
    {
        if( position > 0 )
        {
            while( position > 1 )
            {
                current = current->next;
                position--;
            }
            //记录删除的节点
            delet = current->next;

            //使当前指针指向下一个状态
            current->next = delet->next;

            //释放要删除的内存
            free(delet);
        
        }else if( position == 0 )
        {
            //使当前指针直接指向下一个节点
            p = current->next;

            //释放内存
            free(current);
        }
        else 
        {
            printf("\nError:输入错误!\n");
            goto loop;
        }
        //调用查看效果
        list(p);
    }else 
    {
        printf("\nError:输入错误!\n");
        goto loop;
    }
}

//回显查找的元素,可用于以后的拓展,故写成一个函数
void display(struct student *p)
{
    printf("%s \n", p->name);
}

//查找元素
void search(struct student *p)
{
    struct student *current;
    int position;
    
    current = p;
loop:
    printf("请输入需要查找的位置:\n");

    scanf("%d",&position);
    if( judge(p,position) == true)
    {
        //根据输入查找对应位置
        if( position > 0 )
        {
            while( position > 1 )
            {
                current = current->next;
                position--;
            }

            p = current->next;

        }else if( position == 0 )
        {
            p = current;
        }
        else 
        {
            printf("Error:输入错误!");
            goto loop;
        }
        //显示查找的内容
        display(p);
    }else
    {
        printf("\nError:输入错误!\n");
        goto loop;
    }
}
void main()
{
    struct student *p;

    //创建链表
    p = create();

    //删除链表
//    delet(p);

    //插入元素
//    insert(p);

    //查找元素
    search(p);
}

 

查找功能效果如下图所示:

 

转载于:https://www.cnblogs.com/veis/p/7066366.html

#include<iostream> using namespace std; enum yaya { error,success }; struct node { int data; node*next; }; class List{ public: List(); ~List(); int length(); yaya set_data(int n); node* get_ptr(int m); yaya inset_node(int x,int y); int delete_node(int i); void put_in(int x); void breaktwo(List&la,List&lb); void same_data(List&l1,List&l2,List&l); int out_data(); private: int count; node* head; }; List::List(){ head=new node; head->next=NULL; count=0; } int List::length(){ return count; } yaya List::set_data(int n){ node*p=head; for(int j=0;j<n;j++){ cin>>p->data; p=p->next; count++; if(p==NULL){ return error; } } return success; } node* List::get_ptr(int m){ node*p=head; int j=0; while(p!=NULL&&j<m){ j++; p=p->next; } return p; } yaya List::inset_node(int x,int y){ if(x<=0||x>count+1){ return error; } node*p=new node; p->data=y; node*current=head; for(int j=1;j<x;j++){ current=current->next; } p->next=current->next; current->next=p; count++; return success; } int List::delete_node(int i){ if(i<=0||i>count) return NULL; node*current=head; for(int j=1;j<i;j++){ current=current->next; }node*u=current->next; current->next=u->next; delete u; count--; return success; } void List::put_in(int x){ node*p=new node; p->data=x; node*current=head; for(;current!=NULL&&current->next!=NULL&&current->next->data<x;){ current=current->next; } p->next=current->next; current->next=p; count++; return; } void List::breaktwo(List& la,List& lb){ node*q=head->next; la.inset_node(la.count+1,q->data); while(q!=NULL&&q->next!=NULL&&q->next->next!=NULL){ q=q->next->next; la.inset_node(la.count+1,q->data); } node*w=head->next->next; lb.inset_node(lb.count+1,w->data); while(w!=NULL&&w->next!=NULL&&w->next->next!=NULL){ w=w->next->next; lb.inset_node(lb.count+1,w->data); } } void List::same_data(List&l1,List&l2,List&l){ node*p=l1.head; for(int i=1;i<=l1.count;i++){ p=p->next; node*q=l2.head; for(int j=1;j<=l2.count;j++){ q=q->next; if(p->data==q->data) l.inset_node(l.length()+1,p->data); } } } int List::out_data(){ node*p=head; for(int j=1;j<=count;j++){ p=p->next; cout<<(p->data)<<" "; } cout<<endl; return 0; } List::~List(){ node*p=head,*s; while(p!=NULL){ s=p; p=p->next; delete s; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值