鱼C论坛

 找回密码
 立即注册
查看: 2550|回复: 4

C语言的单链表问题,求助!

[复制链接]
发表于 2019-10-8 19:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(1)定义单链表link1,用尾插入法创建link1,并输出创建后的link1元素序列。
(2)计算link1的长度,并将结果存放在头结点的数据域中,然后输出单链表的所有元素(包含头结点,头结点作为第一个输出)
单链表的函数已完成,第二题求解,怎么调用函数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-8 20:13:10 | 显示全部楼层
从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-8 20:48:33 | 显示全部楼层
理想小青年 发表于 2019-10-8 20:13
从头开始写就太麻烦了,如果你会的话就
https://blog.51cto.com/13352079/2126869
参考上面代码改改吧{:1 ...

头文件我已经完成了,只需要写主函数即可,第二问有点不知道怎么调用函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-8 20:51:24 | 显示全部楼层
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
typedef  int  elemtype;
typedef  struct  node   //结点类型定义
{
  elemtype  data;
  struct  node  *next;
} LinkList,node;


LinkList*Init_LinkList()/*初始化空的单链表*/
{        elemtype  ix;
        LinkList  *head, *p;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;
        return(head);
}

LinkList*Create_LinkListF()/*头插法建立带头结点的单链表函数*/
{        elemtype  ix;
        LinkList  *head, *p;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;
        printf("请输入数据直到输入0结束:\n");
        scanf("%d", &ix);
        while (ix != 0)
        {    p = (LinkList *) malloc( sizeof( LinkList ) );        //①
             p->data = ix;                                        //②
             p->next = head->next;                                //③
             head->next = p;                                        //④
             scanf("%d", &ix);
        }
        return(head);
}

LinkList *Create_LinkListR( ) /*尾插法建立带头结点的单链表函数*/
{        elemtype  ix;
        LinkList  *head, *p, *tail;
        head = (LinkList *) malloc ( sizeof( LinkList ) );
        head->next = NULL;                                                 tail = head;
    printf("请输入数据直到输入0结束:\n");
        scanf("%d", &ix);
        while (ix != 0)
        {        p = (LinkList *) malloc( sizeof( LinkList ) );
                p->data = ix;
                tail->next = p;
                tail = p;
                tail->next = NULL;
                scanf("%d", &ix);
        }
        return( head );
}
void Print_LinkList( LinkList  *head)//输出
{        LinkList  *p = head->next;
        while(p != NULL)
        {        printf("%d ", p->data);
            p = p->next;
        }
}

int LinkList_Length (LinkList  *head )//求长度
{        LinkList  *p = head; /*p指向头结点*/
        int  j = 0;
        while( p->next)
        {        p=p->next;         /*p所指的是第j个结点*/
                j ++;
        }
        return  j;
}

//按序号查找:    从链表的第一个结点起,判断当前结点是否是第i个,
//若是,则返回该结点的指针,否则继续下一个,直到表结束为止。没有第i个结点时返回空。
LinkList *GetData_LinkList(LinkList *head, int i)//返回第i个节点的指针
{        LinkList *p;         int  j = 0;
        if (i <= 0)                return NULL;
        p = head;
        while( p->next && j < i )
        {        p = p->next;
                j ++;
        }
        if ( i == j)        return  p;
        else                return  NULL;
}

//按值查找:
//从链表的第一个结点起,判断当前结点是否等于key,若是,则返回该结点的指针,
//否则继续下一个,直到表结束为止。找不到时返回空。
LinkList *Search_LinkList(LinkList  *head, elemtype  key)//返回值为key的地址
{        LinkList *p;
        p = head->next;
        while( p)
        if ( p->data != key )
                p = p->next;
        else
                break;
        return  p;
}

//后插运算算法
void InsertAfter_LinkList(LinkList *p, elemtype  x)//在结点p后面插入值为x的节点
{ LinkList  *s;
  s = (LinkList *) malloc ( sizeof( LinkList ) );
                         // ①生成新结点
  s->data = x;                //②新结点赋值
  s->next = p->next;        //③新结点链入
  p->next = s;                //④修改前趋结点的后向链
}


//在指定位置i插入x
int InsertNo_LinkList(LinkList*head,elemtype x,int i)
{
    LinkList*p;
    if(i<=0)p=NULL;
    else if(i==1)p=head;
    else
        p=GetData_LinkList(head,i-1);
    if(p==NULL)
    {
        return 0;
    }
    else
    {
        InsertAfter_LinkList(p,x);
        return 1;
    }
}

//删除后继结点算法
/*删除p的后继结点,成功返回1;否则返回0*/
int  DeleteAfter_LinkList(LinkList *p)
{        LinkList *r;
        if ( !p ) {         return 0;}
        r = p->next;
        if ( !r )
        {        return 0;      }
        p->next = r->next;
        free( r );
        return( 1 );
}

//删除单边表head的指定结点p
int DeleteNode_LinkList(LinkList*head,LinkList*p)
{
    LinkList*r;
    if(p->next!=NULL)
    {
        p->data=p->next->data;
        return(DeleteAfter_LinkList(p));
    }
    else
    {
        r=head;
        while(r->next!=p)
            r=r->next;
        return(DeleteAfter_LinkList(r));
    }
}


//删除指定位置的结点:在带头结点的链表中删除第i个结点。删除第i个结点,就必须找到它的前驱结点,
//即第i – 1个结点p,然后再删除p的后继结点。
int  DeleteNo_LinkList( LinkList *head, int  i ) /*删除成功返回1,否则返回0*/
{        LinkList *p, *r;
        if ( i == 0)  p = NULL;
        else if (i == 1 ) p = head;
        else  p = GetData_LinkList(head, i-1);/*搜索第i-1个结点*/
        if ( p == NULL)
        {
                return 0;
        }
        else
        {        r = p->next;        p->next = r->next; /*删除指定结点*/
                free( r );
                return  1;
        }
}

//将已存在的单链表的所有结点删除,释放其所占用的存储空间,使其成为带头结点的空链表。
LinkList * SetNull_LinkList(LinkList *head)
{        while (head->next)
                DeleteAfter_LinkList(head);         /*依次删除每个结点*/
        return head;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-9 12:31:02 | 显示全部楼层
本帖最后由 superbe 于 2019-10-9 12:35 编辑

参考代码如下。我把LinkList_Length 和 Print_LinkList各修改了一行,因为题目说要包括头结点,你自己决定吧。
void Print_LinkList( LinkList  *head)//输出
{       //LinkList  *p = head->next;
        LinkList  *p = head;
        while(p != NULL)
        {       printf("%d ", p->data);
                p = p->next;
        }
}
int LinkList_Length (LinkList  *head )//求长度
{        LinkList  *p = head; /*p指向头结点*/
        //int  j = 0;
        int  j = 1;
        while( p->next)
        {       p=p->next;         /*p所指的是第j个结点*/
                j ++;
        }
        return  j;
}
int main()
{
        LinkList *head;
        head=Create_LinkListR();            //尾插法创建链表
        head->data = LinkList_Length(head); //将链表长度存放在头结点的数据域
        Print_LinkList(head);               //输出单链表的所有元素

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 13:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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