大家好,我直奔主题!问题:在学循环链表插入函数的时候,我没有用带返回类型的函数,,,然后在输出链表元素的时候,总是有一个元素输出的是一大串数字(是元素的地址):
有问题的代码和截图:
#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;
}结果:
最后一个不应该是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);就好了。
解决方法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);即可
结果如图:
完整代码:
一、
#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,在主函数里面赋值就可以了!!!!
本人比较菜,如有不对或者说的不清楚的,还望指正。