栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

循环链表(写插入元素函数)有关的传参问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

循环链表(写插入元素函数)有关的传参问题

大家好,我直奔主题!问题:在学循环链表插入函数的时候,我没有用带返回类型的函数,,,然后在输出链表元素的时候,总是有一个元素输出的是一大串数字(是元素的地址):

有问题的代码和截图:

#include

#include

#include

typedef int DataType;

typedef struct node{

DataType data;

struct node *next;

}linkNode,*link;

//初始化循环单链表void InitlinkList(linkNode *H){

H->next = H;

}

void InsertElement(linkNode *H){

printf("请输入要插入元素的个数:");

int n,i;

scanf("%d",&n);getchar();

printf("请分别输入元素的值:n");

DataType d; linkNode *head = H->next;

for(i = 0;i

scanf("%d",&d);getchar();

linkNode *s=(linkNode*)malloc(sizeof(linkNode));

s->data = d; s->next = H->next;

H->next = s;H = s;

}

}

//输出列表元素

void ShowlinkList(linkNode *H){

linkNode *p,*head; head = H->next;

p = head;

printf("链表元素为:n");int i = 0;

while(p->next != head){

//printf("%d----",i);

printf("%dn",p->next->data);

p = p->next;i++;

}

}

int main(){

linkNode *H = (linkNode*)malloc(sizeof(linkNode));

//初始化循环单链表 InitlinkList(H);

//插入法建立循环链表 InsertElement(H);

//输出链表元素 ShowlinkList(H); system("pause");

return 0;

}结果:

 最后一个不应该是5吗???咋回事儿

先说解决方法:

解决方法1.

将插入函数的代码换成:

void InsertElement(linkNode **H){

 printf("请输入要插入元素的个数:");

 int n,i;scanf("%d",&n);getchar();

 printf("请分别输入元素的值:n");

 DataType d;

 linkNode *head = (*H)->next;

 for(i = 0;i

  scanf("%d",&d);getchar();

  linkNode * s =(linkNode*)malloc(sizeof(linkNode));

  s->data = d;

  s->next = (*H)->next;

  (*H)->next = s;*H = s;

 }

}

并且,main函数里把InsertElement(H);换成InsertElement(&H);就好了。

 解决方法2.

将插入函数的代码换成:

linkNode* InsertElement(linkNode *H){

 printf("请输入要插入元素的个数:");

 int n,i;scanf("%d",&n);getchar();

 printf("请分别输入元素的值:");

 DataType d;

 linkNode *head = H->next;

 for(i = 0;i

  scanf("%d",&d);getchar();

  linkNode *s =

(linkNode *)malloc(sizeof(linkNode));

  s->data = d;

  s->next = H->next;

  H->next = s;H = s;

 }

 return H;

}

并且,main函数里把InsertElement(H);换成

H = InsertElement(H);即可

结果如图:

 完整代码:

一、

#include

#include

#include

typedef int DataType;

typedef struct node{

 DataType data;

 struct node *next;

}linkNode,*link;

 //初始化循环单链表

void InitlinkList(linkNode *H){

 H->next = H;

}

    //插入法建立循环链表
void InsertElement(linkNode **H){
    printf("请输入要插入元素的个数:");
    int n,i;scanf("%d",&n);getchar();
    printf("请分别输入元素的值:");
    DataType d;
    linkNode *head = (*H)->next;
    for(i = 0;i         scanf("%d",&d);getchar();
        linkNode *s = (linkNode *)malloc(sizeof(linkNode));
        s->data = d;
        s->next = (*H)->next;
        (*H)->next = s;*H = s;
    }
}

 //输出列表元素

void ShowlinkList(linkNode *H){

 linkNode *p,*head;

 head = H->next;

 p = head;

 printf("链表元素为:n");int i = 0;

 while(p->next != head){

  //printf("%d----",i);

  printf("%dn",p->next->data);

  p = p->next;i++;

 }

}

int main(){

 linkNode *H = (linkNode *)malloc(sizeof(linkNode));

 //初始化循环单链表

 InitlinkList(H);

 //插入法建立循环链表

 InsertElement(&H);

 //输出链表元素

 ShowlinkList(H);

 system("pause");

 return 0;

}

二、

#include

#include

#include

typedef int DataType;

typedef struct node{

 DataType data;

 struct node *next;

}linkNode,*link;

 //初始化循环单链表

void InitlinkList(linkNode *H){

 H->next = H;

}

    //插入法建立循环链表
linkNode* InsertElement(linkNode *H){
    printf("请输入要插入元素的个数:");
    int n,i;scanf("%d",&n);getchar();
    printf("请分别输入元素的值:");
    DataType d;
    linkNode *head = H->next;
    for(i = 0;i         scanf("%d",&d);getchar();
        linkNode *s = (linkNode *)malloc(sizeof(linkNode));
        s->data = d;
        s->next = H->next;
        H->next = s;H = s;
    }
    return H;
}

 //输出列表元素

void ShowlinkList(linkNode *H){

 linkNode *p,*head;

 head = H->next;

 p = head;

 printf("链表元素为:n");int i = 0;

 while(p->next != head){

  //printf("%d----",i);

  printf("%dn",p->next->data);

  p = p->next;i++;

 }

}

int main(){

 linkNode *H = (linkNode *)malloc(sizeof(linkNode));

 //初始化循环单链表

 InitlinkList(H);

 //插入法建立循环链表

 H = InsertElement(H);

 //输出链表元素

 ShowlinkList(H);

 system("pause");

 return 0;

}

原因:

之所以错是因为传参不对,因为我没加返回值,传入的是*H,它本身就是个链表,而我在函数里面用到了H = s;这个语句,但是函数调用完之后,这个链表不会随着函数的结束返回到主函数里面。就相当于我传入x,在函数里面令x = 3;而主函数里的x不会是3。所以,我需要用到**H(见方法二),对地址进行操作,地址里面的内容就会改变。还可以带返回类型,返回一个*H,在主函数里面赋值就可以了!!!!

 

本人比较菜,如有不对或者说的不清楚的,还望指正。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779108.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号