找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3692|回复: 0
打印 上一主题 下一主题
收起左侧

C语言在链表中删除结点

[复制链接]
跳转到指定楼层
楼主
ID:73477 发表于 2015-2-10 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/****************************************************************
    该程序实现结点的删除。
    其中void *del_node(TYM *head,int pos,int len)函数用于删除结
点,head为需要删除结点的链表、pos为结点的位置、len为需要删除
的长度。
****************************************************************/

#include <stdio.h>
#include <stdlib.h>

typedef struct stu                                            //定义TYM类型
{
    char name[20];
    int num;
    struct stu *next;
}TYM;

void *del_node(TYM *head,int pos,int len)     //删除结点指针函数
{
    int i;
    TYM *p,*q;
    if(pos==1)                                                   //如果删除的位置是首地址
    {
        for(i=0;i<len;i++)                                    //删除len个结点
        {
            p = head;                                          //使p指向head
            head = head->next;                          //使head指向下一个结点
            free(p);                                             //释放p指向的结点
        }
    }
    else
    {
        for(p=head,i=1;i<pos-1;i++)                 //当pos不是首地址时,找到pos的位置
        {
            p = p->next;                                     //使p指向下一个结点,直到第pos个结点为止
        }
        for(i=0;i<len;i++)                                  //删除len个结点
        {
            q = p->next;                                    //使q指向p的下一个结点
            p->next = q->next;                          //将q的下一个结点的地址传给p的next
            free(q);                                          //释放q指向的结点
        }
    }
    return head;                                          //返回首地址
}

void freeall(TYM *head)                            //释放函数
{
    TYM *p;
    for(p=head;p!=NULL;)                          //释放结点直到所有结点被释放
    {
        p = head->next;                              //使p指向下一个结点
        free(head);                                     //释放当前结点
        head = p;                                       //使head指向下一个结点
    }
    if(p==NULL)                                       //如果全部释放
        printf("********* Free Success! *********\n");
}

int main()
{
    TYM *head,*p,*q;
    int i,pos;
    head = p = (TYM *)malloc(sizeof(TYM));           //开辟一个新的空间
    printf("*********************************\n");
    printf("Please Input :\n");
    scanf("%s%d",head->name,&head->num);       //对新空间赋值
    for(i=0;i<4;i++)                                                  //创建4个空间
    {
        q = (TYM*)calloc(1,sizeof(TYM));                 //将开辟的空间的首地址赋给q
        p->next = q;                                                 //将q的值传递给p的next成员
        p = q;                                                           //使p指向q
        scanf("%s%d",p->name,&p->num);             //对新空间赋值
        p->next = NULL;                                          //使空间的next成员不指向任何方向
    }
    printf("************ Output *************\n");
    for(p=head;p!=NULL;p=p->next)                     //输出链表
    {
        printf("%s\t%d\n",p->name,p->num);           //输出当前变量的值
    }
    printf("DELETE......\n");
    printf("******** Position & Lenth *******\n");
    printf("Position:\t");
    scanf("%d",&pos);                                           //输入删除结点的地址
    printf("Lenth:\t\t");
    scanf("%d",&i);                                                //输入删除结点的个数
    head = del_node(head,pos,i);
    printf("********** Output all ***********\n");
    for(p=head;p!=NULL;p=p->next)                     //输出经删除后的链表
    {
        printf("%s\t%d\n",p->name,p->num);          //输出当前变量的值
    }
    freeall(head);                                                 //释放链表
    return 0;
}


****************************************调试窗口****************************************




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表