0
点赞
收藏
分享

微信扫一扫

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

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

有问题的代码和截图:

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

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<n;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("%d\n",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;

}结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YW36YW355qELUFsYW4=,size_20,color_FFFFFF,t_70,g_se,x_16

 最后一个不应该是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<n;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);就好了。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YW36YW355qELUFsYW4=,size_20,color_FFFFFF,t_70,g_se,x_16

 解决方法2.

将插入函数的代码换成:

LinkNode* InsertElement(LinkNode *H){

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

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

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

 DataType d;

 LinkNode *head = H->next;

 for(i = 0;i<n;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);即可

结果如图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6YW36YW355qELUFsYW4=,size_20,color_FFFFFF,t_70,g_se,x_16

 完整代码:

一、

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

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<n;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("%d\n",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<stdio.h>

#include<stdlib.h>

#include<malloc.h>

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<n;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("%d\n",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,在主函数里面赋值就可以了!!!!

 

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

 

举报

相关推荐

0 条评论