链表

2016.7 6
复习
标准模板库:namespace
namespace::成员

                  using namespace std;
                  std::cout

类型转换:dynamic_cast<子类指针>(父类指针)若失败返回NULL 动态类型转换
static_cast:静态类型转换:强制类型转换
字符串:char * str=“string”;
C++提供一个类string(系统已经将正常使用的运算符重载好了,空间也不需要程序员管理)
string str;
容器:
顺序容器:
vector(向量) 随机访问【】at 尾部增删元素
deque(双端队列) 随机访问【】 at 头部和尾部增删元素
list(列表) 不能随机访问(无【】,at),可在任意位置增删元素 要访问必须使用迭代器
关联容器: key value
set (key value 映射)不能有重复的value
multaste 可以有重复value
map (key value)key:一般都使用字符串,value:不能有重复key
multimap 可以重复key.
map

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

typedef struct Nobe{
    char name[20];
    int age;
    struct Nobe* link;
}student;
/*
 1.创建头节点
 2.新建节点 sNode
 3.使用动态指针来让节点指向新创建节点
 4.让动态指针指向新创建节点 pNode=sNode
 */
student* createList(int n)
{
    student* head=NULL;
    student* pNode=NULL;
    student* sNobe=NULL;
    if((head=(student*)malloc(sizeof(student)))==NULL)
    {
         printf("Memory allocation fail。。。");
    return NULL;
    }
    strcpy(head->name,"headNobe");
    head->age=25;
    head->link=NULL;

    pNode=head;
    for(int i=0;i<n;i++)
    {
        if((sNobe=(student*)malloc(sizeof(student)))==NULL){
            printf("Memory allocation fail。。。\n");
            return NULL;
        }
    pNode->link=sNobe;
    printf("please input %d person name:\n",i+1);
    scanf("%s",sNobe->name);
    printf("please input %d person age:\n",i+1);
    scanf("%d",&(sNobe->age));
    sNobe->link = NULL;
    pNode=sNobe;
    }
    return head;
}
//输出链表所有节点(head:链表头节点)
void showNode(student* head){
    student* pNobe;//动态节点
    pNobe=head;
    while(pNobe!=NULL){//判断节点是否为空
        printf("---------------\n");
        printf("name=%s\n",pNobe->name);
        printf("age=%d\n",pNobe->age);

        pNobe=pNobe->link;
    }
}
//插入节点(pNode:在pNode节点后添加节点)
void insertNobe(student * pNobe){
    char name[20];
    int age;
    student* sNobe=NULL;//新节点
    if((sNobe=(student*)malloc(sizeof(student)))==NULL)//判断空间分配是否成功
    {
        printf("Memory allocation fail。。。\n");
        return ;
    }
    printf("please input name\n");
    scanf("%s",name);
    strcpy(sNobe->name, name);
    printf("please input age\n");
    scanf("%d",&age);
    sNobe->age=age;

    sNobe->link=pNobe->link;
    pNobe->link=sNobe;

}
//删除节点(head:链表头节点,name:删除节点名字)
student* deleteNobe(student* head,char* name)
{
    if(head==NULL)
    {
        return NULL;
    }
    student* p1Nobe=NULL;
    student* p2Node=NULL;

    p1Nobe=head;
    p2Node=head->link;
    if(strcmp(p1Nobe->name, name)==0)//判断是否删除头节点
    {
        head=head->link;
        free(p1Nobe); //删除节点,释放节点
        return head;
    }
    while (p2Node!=NULL) {
        if(strcmp(p2Node->name, name)==0)//搜索节点name与name相同的节点
        {
            p1Nobe->link=p2Node->link;
            free(p2Node); //删除节点,释放节点
            //deleteNobe(head, name);
            return head;
        }
        //p1Node p2Node分别向后移动
    p1Nobe=p2Node;
    p2Node=p1Nobe->link;
    }
    return head;
}
//查找节点
student* searchNode(student* head,char* name){
    student * pNode=head;
    while(pNode!=NULL)
    {
        if(strcmp(pNode->name, name)==0)
        {
            return pNode;
        }
        pNode=pNode->link;
    }
    return pNode;    //
}
//删除整个链表
void deleteAll(student * head){
    student* p1Node=head;
    student* p2Node=head->link;
    student* p3Node=p2Node->link;
    while(p2Node!=NULL)
    {
        p1Node->link=p3Node;
        free(p2Node);
        p2Node=p3Node;
        if(p2Node!=NULL)
        p3Node=p2Node->link;
    }
    head=NULL;
}
//找到中间节点
void findMiddle(student* head){
    student* p1Node=head;
    student* p2Node=head;
    int n=1;
    while(p1Node->link!=NULL)
    {
        p1Node=p1Node->link;
        n++;
    }
    for(int i=0;i<n/2;i++)
    {
        p2Node=p2Node->link;
    }
    printf("---------------\n");
    printf("name=%s\n",p2Node->name);
    printf("age=%d\n",p2Node->age);
}
//连接两个链表
student* Link(student* head1,student *head2){
    student* p1Node=head1;
    student* p2Node=head2;
    while (p1Node->link!=NULL){
        p1Node=p1Node->link;
    }
    p1Node->link=p2Node;
    return head1;
}
//将链表逆序
student* invertedSequence(student* head){
    /*student* p1Node=head;
    student* p2Node=NULL;
    student* p3Node=NULL;

    while (p1Node!=NULL) {
        p2Node=p1Node->link;
        p1Node->link=p3Node;
        p3Node=p1Node;
        p1Node=p2Node;
    }*/


    student* p1Node=head;
    student* p2Node=head->link;
    student* p3Node=p2Node;

    p1Node->link=NULL;
    p2Node->link=p1Node;
    while(p2Node!=NULL)
    {
        if(p2Node!=NULL)
        p3Node=p2Node->link;
        p1Node=p2Node;
        p2Node=p3Node;

        p2Node->link=p1Node;
    }

    return p3Node;
}

int main(int argc, const char * argv[]) {

    student* head=createList(2);
   // student* head1=createList(2);
    showNode(head);
    cout<<endl;
   // showNode(head1);

    //insertNobe(head);
    deleteAll(head);
    //deleteNobe(head,(char*)"a");
    //cout<<"................"<<endl;
    //findMiddle(head);
    /*cout<<endl;
    cout<<"---------"<<endl;
    Link(head, head1);*/

    //student* head2=invertedSequence(head);    //逆序
    //showNode(head2);

     showNode(head);
    std::cout << "Hello, World!\n";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值