大家好,我直奔主题!问题:在学循环链表插入函数的时候,我没有用带返回类型的函数,,,然后在输出链表元素的时候,总是有一个元素输出的是一大串数字(是元素的地址):
有问题的代码和截图:
#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 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; } //插入法建立循环链表 //输出列表元素 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,在主函数里面赋值就可以了!!!! 本人比较菜,如有不对或者说的不清楚的,还望指正。
void InsertElement(linkNode **H){
printf("请输入要插入元素的个数:");
int n,i;scanf("%d",&n);getchar();
printf("请分别输入元素的值:");
DataType d;
linkNode *head = (*H)->next;
for(i = 0;i
linkNode *s = (linkNode *)malloc(sizeof(linkNode));
s->data = d;
s->next = (*H)->next;
(*H)->next = s;*H = s;
}
}
linkNode* InsertElement(linkNode *H){
printf("请输入要插入元素的个数:");
int n,i;scanf("%d",&n);getchar();
printf("请分别输入元素的值:");
DataType d;
linkNode *head = H->next;
for(i = 0;i
linkNode *s = (linkNode *)malloc(sizeof(linkNode));
s->data = d;
s->next = H->next;
H->next = s;H = s;
}
return H;
}



