鱼C论坛

 找回密码
 立即注册
查看: 2276|回复: 8

[已解决]尾插法里的变量含义

[复制链接]
发表于 2018-10-17 17:43:50 | 显示全部楼层 |阅读模式

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

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

x
  1. /* 尾插法建立单链表演示 */

  2. void CreateListTail(LinkList *L, int n)
  3. {
  4.     LinkList p, r;
  5.     int i;

  6.     srand(time(0));
  7.     *L = (LinkList)malloc(sizeof(Node));
  8.     r = *L;

  9.     for( i=0; i < n; i++ )
  10.     {
  11.         p = (Node *)malloc(sizeof(Node));
  12.         p->data = rand()%100+1;
  13.         r->next = p;
  14.         r = p;                 // 备注:初学者可能很难理解这句,重点解释。
  15.     }

  16.     r->next = NULL;
  17. }
复制代码

这个L  是指向链表的指针  还是 指向 什么
最佳答案
2018-10-17 17:47:52
指针的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-17 17:47:52 | 显示全部楼层    本楼为最佳答案   
指针的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-17 18:05:21 | 显示全部楼层

那上面那个算法对应的主函数里的实参应该是指向链表的指针的地址对吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 18:14:51 | 显示全部楼层
大可爱 发表于 2018-10-17 18:05
那上面那个算法对应的主函数里的实参应该是指向链表的指针的地址对吗

嗯,如果是 c++ 就可以传引用

void CreateListTail(LinkList &L, int n)
LinkList L;
CreateListTail(L, 10);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-17 18:50:01 | 显示全部楼层
claws0n 发表于 2018-10-17 18:14
嗯,如果是 c++ 就可以传引用

void CreateListTail(LinkList &L, int n)

LinkList &L   这又是干嘛
好复杂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 19:14:38 | 显示全部楼层
大可爱 发表于 2018-10-17 18:50
LinkList &L   这又是干嘛
好复杂啊

当我没有说过,先顾好 C 语言就好,不要看 C++
void CreateListTail(LinkList *L, int n)
LinkList L;
CreateListTail(&L, 10);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-18 09:54:10 | 显示全部楼层
claws0n 发表于 2018-10-17 19:14
当我没有说过,先顾好 C 语言就好,不要看 C++
void CreateListTail(LinkList *L, int n)
Li ...

&list 还是发生了。
有个问题,注释里说list 指向被插入的新节点。那么这之前list 是指向 链表首地址的,之后不指向首地址, 那之后谁指向链表的首地址
webwxgetmsgimg.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-18 10:38:24 | 显示全部楼层
大可爱 发表于 2018-10-18 09:54
&list 还是发生了。
有个问题,注释里说list 指向被插入的新节点。那么这之前list 是指向 链表首地址的 ...

差别在于函数内部的变量不需要解引用~
之前 void CreateListTail(LinkList *L, int n),函数内部 *L
现在 void INSERTLINK5(LinkList &list, ElemType item),函数内部 list
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-18 15:48:41 | 显示全部楼层
这是我看完视频自己写的,有些代码不一样但是基本上算是可以成功进行 添加 删除 获取某位置元素 和 初始化 以及得到链表长度的链表结构操作方法


#include <iostream>
#include <cstdlib>
using namespace std;
struct Node
{
        int data;
        Node *next;
};
//获取链表指定位置元素
bool GetElem(Node *nd,int i,int *el)
{
        Node * p = nd;
        int j = 1;
        while (p!=NULL && j < i)
        {
                p = p->next;
                j += 1;
        }
        if (p == NULL || j > i)
        {
                delete p;
                return false;
        }
        *el = p->data;
       
        return true;
}
//插入链表元素
bool InsertElem(Node *nd, int i,Node *el)
{
        Node *p = nd;
        int j = 1;
        while (p!=NULL && j < i-1)
        {
                p = p->next;
                j += 1;
        }
        if (p == NULL || j > i)
        {
               
                return false;
        }
        Node *s = p->next;
        p->next = el;
        el->next = s;
       

        return true;
}
//得到链表长度
int NodeListLength(Node *nd)
{
        int j = 0;
        Node *p = nd;
        while (p != NULL)
        {
                p = p->next;
                j += 1;
        }
        return j;
}
//删除元素
bool DeleteListElem(Node *nd, int i)
{
        Node * p = nd;
        int j = 1;
        while (p != NULL && j < i - 1)
        {
                p = p->next;
                j += 1;
        }
        if (p == NULL || j > i)
        {
                return false;
        }
        p->next = p->next->next;
        return true;
}
void CreateListTail(Node *nd, int n)
{
        Node *p = nd;
        for (int i = 0; i < n; i++)
        {
                Node * s = new Node;
                s->data = rand() % 999;
                p->next = s;
                s->next = NULL; //将下一个指针为NULL
                p = s;
        }
}
int main()
{
        Node s1{ 1,NULL };
        Node * s0 = &s1;
       
        int el;
        cout << "链表创建....\n";

        CreateListTail(s0,10);
        cout << "链表创建完成...\n链表的总长度为:";
        std::cout << NodeListLength(s0) << endl;
        cout << "展示链表元素:\n";
        for (int i = 1; i <= NodeListLength(s0); i++)
        {
                GetElem(s0, i, &el);
                std::cout << el << endl;
        }
        int num;
        cout << "输入您要删除的元素位置:";
        cin >> num;
        if (DeleteListElem(s0, num) && num <= NodeListLength(s0))
        {
                cout << "删除成功...." << endl;
        }
        else {
                cout << "删除失败...." << endl;
        }
        cout << "展示链表元素:\n";
        for (int i = 1; i <= NodeListLength(s0); i++)
        {
                GetElem(s0, i, &el);
                std::cout << el << endl;
        }
        cout << "链表的总长度为:";
        std::cout << NodeListLength(s0) << endl;
        std::system("pause");
        return 0;
}

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 05:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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