大可爱 发表于 2018-10-17 17:43:50

尾插法里的变量含义

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

void CreateListTail(LinkList *L, int n)
{
    LinkList p, r;
    int i;

    srand(time(0));
    *L = (LinkList)malloc(sizeof(Node));
    r = *L;

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

    r->next = NULL;
}
这个L是指向链表的指针还是 指向 什么

claws0n 发表于 2018-10-17 17:47:52

指针的指针

大可爱 发表于 2018-10-17 18:05:21

claws0n 发表于 2018-10-17 17:47
指针的指针

那上面那个算法对应的主函数里的实参应该是指向链表的指针的地址对吗

claws0n 发表于 2018-10-17 18:14:51

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

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

void CreateListTail(LinkList &L, int n)
LinkList L;
CreateListTail(L, 10);

大可爱 发表于 2018-10-17 18:50:01

claws0n 发表于 2018-10-17 18:14
嗯,如果是 c++ 就可以传引用

void CreateListTail(LinkList &L, int n)


LinkList &L   这又是干嘛
好复杂啊

claws0n 发表于 2018-10-17 19:14:38

大可爱 发表于 2018-10-17 18:50
LinkList &L   这又是干嘛
好复杂啊

当我没有说过{:10_260:},先顾好 C 语言就好,不要看 C++
void CreateListTail(LinkList *L, int n)
LinkList L;
CreateListTail(&L, 10);

大可爱 发表于 2018-10-18 09:54:10

claws0n 发表于 2018-10-17 19:14
当我没有说过,先顾好 C 语言就好,不要看 C++
void CreateListTail(LinkList *L, int n)
Li ...

&list 还是发生了。
有个问题,注释里说list 指向被插入的新节点。那么这之前list 是指向 链表首地址的,之后不指向首地址, 那之后谁指向链表的首地址

claws0n 发表于 2018-10-18 10:38:24

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

{:10_269:} 差别在于函数内部的变量不需要解引用~
之前 void CreateListTail(LinkList *L, int n),函数内部 *L
现在 void INSERTLINK5(LinkList &list, ElemType item),函数内部 list

不许偷懒的小猫 发表于 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;
}

{:5_109:}
页: [1]
查看完整版本: 尾插法里的变量含义