找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C语言在链表中插入结点

[复制链接]
跳转到指定楼层
楼主
ID:73477 发表于 2015-2-10 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************************

该程序实现链表的结点插入:
        程序中的void Deletestu(TYM *head)是用来释放已经生成的链表空间,程序中的
TYM *Insert(TYM *head,int pos,int n)函数是用来插入新的结点并返回整个链表的首地址。
在这程序中,主函数首先默认链表的长度为5*TYM,然后输入五个变量的值并输出。接着是
插入结点通过输入i和n的值来设置插入的位置和长度,最后将整理后的新链表中的信息一
起输出。

*********************************************************************************/

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

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

void Deletestu(TYM *head)                                       //释放函数
{
    TYM *p;                                                                 //定义TYM类型的指针
    for(p=head;p!=NULL;head = p)            //释放整条链的程序空间
    {
        p=head->next;
        free(head);     
    }
    if(p==NULL)                                                           //如果释放成功,则输出标志
    printf("**** Free success! *****\n");
}

TYM *Insert(TYM *head,int pos,int n)                        //插入结点指针函数
{
    TYM *p,*q,*head_i,*head_ii;
    int i;
    head_i = p = (TYM *)malloc(sizeof(TYM));            //开辟一个新的空间
    printf("************************\n");
    printf("Please Input The Information Of Insert:\n");
    scanf("%s%d",p->name,&p->num);                       //对新的空间进行赋值
    for(i=0;i<n-1;i++)                                                   //开辟N个空间
    {
        q = (TYM *)malloc(sizeof(TYM));                       //开辟一个新的空间
        p->next = q;                                                      //将新空间的地址给前一个变量的next成员
        p = q;                                                                //将新空间的地址赋给p
        scanf("%s%d",p->name,&p->num);                   //给新开辟的空间赋值
        p->next = NULL;                                                //将新变量的成员next设为不指向任何地址
    }
    if(pos==1)                                                             //如果插入的是第一个地址
    {
        p->next = head;                                                //将原链表的首地址赋给新链表最后一个变量的next成员
        head= head_i;                                                  //将新链表的首地址赋给head
    }
    else
    {
        head_ii = head;
        for(i=1;i<pos-1;i++)  head_ii = head_ii->next;  //找到插入结点的位置
        p->next = head_ii->next;                                  //将要插入结点的位置的变量的next成员的值赋给新链表的最后一个变量的next成员
        head_ii->next = head_i;                                   //将新链表的首地址赋给要插入结点的位置的变量的next成员
    }
    return head;                                                        //返回首地址
}

int main()
{
    TYM *head,*p,*q;                                                 //定义指针变量
    int i,n;
    head = p = (TYM *)calloc(1,sizeof(TYM));            //开辟新空间
    for(i=0;i<4;i++)
    {
        q = (TYM *)malloc(sizeof(TYM));                      //开辟一个新空间
        p->next = q;                                                     //将新空间的地址赋给前一个变量的next成员
        p = q;                                                               //将新空间的地坦赋给p
        p->next = NULL;                                               //使新变量的next成员不指向任何方向
    }
    printf("************************\n");
    printf("Please Input The Information:\n");
    for(p=head;p!=NULL;p = p->next)                       //将整个链表进行赋值
    {
        scanf("%s%d",p->name,&p->num);                 //输入当前变量的值
    }
    printf("******** Output ********\n");
    for(p=head;p!=NULL;p=p->next)                         //将整个链表进行输出
    {
        printf("%s\t%d\n",p->name,p->num);               //输出当前变量的值
    }
    printf("************************\n");
    printf("Please Input The Insert Position:\n");
    printf("Position:\t");
    scanf("%d",&i);                                                    //输入需要插入的位置
    printf("Lenth:\t\t");
    scanf("%d",&n);                                                   //输入插入链表的长度
    head = (TYM*)Insert(head,i,n);                            //调用插入函数,将返回的值强制转换为(TYM*)类型
    printf("****** Output All ******\n");
    for(p=head;p!=NULL;p=p->next)                          //将插入后的链表全部输出
    {
        printf("%s\t%d\n",p->name,p->num);                //输出当前变量的值
    }
    Deletestu(head);                                                  //释放整条链表
    return 0;
}





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




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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