单链表的操作

1.链表的初始化

struct link{
    int data;
    struct link*next;
}
struct link* head;//定义头指针变量
head=(struct link*)malloc(sizeof(struct link));//头指针指向分配的头节点内存空间
head->next=NULL;//头节点指针域为空

2.尾插法建立链表

struct link *r,*s;
int data;
r=head;//r指向头节点
while(1)
{
    scanf("%d",&data);
    if(data==0) break;
    s=(struct link*)malloc(sizeof(sturct link));//为节点分配内存空间
    s->data=data;
    r->next=s;//原来的节点指向新节点
    r=s;//记录r的指向,r指向新节点
}
r->next=NULL;//尾节点指针为空

3.头插法建立链表

struct link *s;
int data;
while(1)
{
    scanf("%d",&data);
    if(data==0) break;
    s=(struct link*)malloc(sizeof(sturct link));//为节点分配内存空间
    s->data=data;
    s->next=head->next;//让新节点指向head所指的下一个节点
    head->next=s;//头节点指向新节点
}

3.输出单向链表

struct link*p;
p=head->next;//指向首元节点
while(p)
{
    printf("%d",p->data);
    p=p->next;//移动指针遍历每个节点
}

4.链表的逆置

struct link*p,*q;
p=head->next;//p指向首元节点
head->next=NULL;//将原链表变为空表,同时也保证了逆置后的链表,为节点指针域为NULL
while(p)
{
    q=p->next;
    p->next=head->next;//保存上一个元素的地址,找到下一个链表元素,例如让第1个节点指向NULL,例如让第2个节点指向第1个节点等等
    head->next=p;//让head始终指向更靠后的链表元素,例如循环一次后head指向第1个节点,接着循环head指向第2个节点,由于有上一行代码,第2个节点同时指向第1个节点,使整个链表能连接起来
    p=q;//改变p的指向,p=NULL时,结束循环,完成逆置。
}

5.单链表的插入

struct link*p=head,*s;
int j=0;
while(p&&j<i-1)//找到要插入节点前的那个节点,找到第(i-1)个节点的地址
{
    p=p->next;
    j++;
}
if(p)
{
    s=(struct link*)malloc(sizeof(struct link));//动态内存申请
    scanf("%d",&s->data);
    s->next=p->next;//新节点指向原来的第i个节点
    p->next=s;//新节点成为新链表的第i个节点
}

6.单项链表元素的删除

struct link*p=head,*s;
int j=0;
while(j<y-1&&p)//找到要插入节点前的那个节点,找到第(x-1)个节点的地址
{
    p=p->next;
    j++;
}
if(p==NULL||p->next==NULL) printf("该节点不存在\n");
else
{
    s=p->next;//s指向第x个节点
    p->next=s->next;//链接删除节点两边的节点
    free(s);//释放要删除节点的内存空间
}

7.链表的删除(释放所有节点占用的内存)

    struct link*p=head,*pr=NULL;
    while(p)
    {
        p=pr;//在pr中保存当前指针
        p=p->next;
        free(pr);
    }

8.单链表的查询

struct link *p=head->next;
while(p)
{
    if(p->data!=z)//z为要查找的数据
    p=p->next;
    else
    break;//找到
    if(p=NULL)
    {
        printf("Nothing");//没找到
    }
    return p;
}

9.链表的长度

    struct link* p=head->next;
    int count=0;
    while(p)
    {
        p=p->next;
        count++;
    }
    return count;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值