链表

1.链表的概念

链表是由若干个结点组成,是一种线性表。结点一般由数据域与指针域,数据域存放数据,指针域存放指向下一结点的地址,从而形成一个链式结构。链表有带头节点head的,也有没有带头节点head的,头节点的数据域不存放数据,而指针域指向下一结点(该结点称为第一个结点),链表的最后一个结点的指针域指向NULL,即空地址,表示链表的结尾。

struct node{
      int data;
      node* next;
}

每次使用新结点时需临时分配内存空间给新结点,可以使用C语言的malloc或者C++的new。

malloc用法:

node* p=(node*)malloc(sizeof(node));

sizeof的作用就是返回一个对象或者类型所占的内存字节数,sizeof(node)就是返回node类型所占的内存字节数,malloc的作用分配内存空间,malloc(sizeof(node))就是向内存申请一块大小为sizeof(node)的空间,并且返回指向这块空间的指针,但该指针类型是void,返回类型是 void 类型,void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针,所以在malloc前面加上(node )进行强制转换,转换成node型指针,赋值给node*型的变量p。

new的用法:

node* p=new node;(只需要new+类型名即可分配一块该类型的内存空间)

在使用完malloc,必须用free释放空间,new相对应就是delete。
free用法:free(p);
delete用法:delete(p);

2. 链表的基本操作

2.1 链表的创建

//创建链表
struct node* create()
{
    struct node *p,*pre,*phead;
    int len,i=1,j;
    phead=(struct node*)malloc(sizeof(struct node));
    phead->next=NULL;
    pre=phead;
    
    printf("设定链表长度为:");
    scanf("%d",&len);
    while(i<len)
    {
        
        printf("第%d个结点的数据是:",i);
        scanf("%d",&j);
        p=(struct node*)malloc(sizeof(struct node));
        if(NULL==p)
        {
            printf("分配失败");
            exit(-1);
        }
        p->data=j;
        p->next=NULL;
        pre->next=p;
        
        pre=p;
        
        i++;
    }
    return phead;
} 

2.2 打印

void print(struct node* phead)
{
    struct node* p;
         p=phead;
    while(p->next!=NULL)//在这一步曾经用p->data!=NULL来做条件,导致输出异常,我认为的是因为到最后一个结点有数据,但没有下一节点,会造成溢出 
    {
        p=p->next;
        printf("%d",p->data);
    }
}

2.3 查找

void search(struct node* phead)
{
    struct node* p=phead;
    int count=0,flag=0,a;
    printf("请输入要查找的元素是:");
    scanf("%d",&a);
    while(p->next!=NULL)
    {
        p=p->next;
        count++;
        if(p->data==a)
        {
            printf("%d在第%d个结点\n",a,count);
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("没有这个元素");
    }
}

2.4 删除

如果要删除p,就是pre->next=p->next;free(p);

void Delete(struct node* phead)
{
    struct node* p,*pre;
    int a;
    p=phead->next;
    pre=phead;
    printf("请输入要删除的元素是:");
    scanf("%d",&a);
    while(p!=NULL)
    {
        if(p->data==a)
        {
            pre->next=p->next;
            free(p);
            p=pre->next;
        }
        else
        {
            pre=p;
            p=p->next;
        }
    }
} 

2.5 插入

插入的重点是先 pnew->next=p;
后pre->next=pnew;

void insert(struct node* phead)
{
    struct node* pnew;
    int a,c;
    pnew=(struct node*)malloc(sizeof(struct node));
    struct node* pre=phead,*p=phead->next;
    printf("新插入结点的数据是:");
    scanf("%d",&a);
    printf("在哪个元素的位置插入:");
    scanf("%d",&c); 
    while(p!=NULL)
    {
        if(c==p->data)
        {
            pnew->next=p;
            pre->next=pnew;
            pnew->data=a;
            break; 
    
        }
        else
        {
            pre=p;
            p=p->next;
        }
    }
} 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容