一个出现-572662307的问题
这是我头文件,typedef struct SingleNode
{
ElemType data;
struct SingleNode *next;
}SingleLinkedList, *LinkList;
void ListInitialize(SingleLinkedList**head) /*单链表初始化*/
{
if ((*head = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
exit(1);
(*head)->next = NULL;
}
int ListGet(SingleLinkedList *head, int i, ElemType *x)/*取序号为i的元素的值*/
{
SingleLinkedList *p;
int j = -1; p = head;
while (j < i)
{
p = p->next;
j++;
}
*x = p->data;
return *x;
}
int ListInsert(SingleLinkedList *head, int i, ElemType x)/*插入数据元素*/
{
SingleLinkedList *p, *q;
int j;
p = head;
j = -1;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (j != i - 1)
{
printf("插入位置参数错");
return 0;
}
if ((q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList))) == NULL)
exit(1);
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
void ListDelete(SingleLinkedList *head, int k, int m)/*删除元素*/
{ /*删除报到第m个的人,从第i个,也就是主函数的k开始*/
SingleLinkedList *p, *r, *q;
int j, i;
p = head;
j = -1;
q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList));
for (j; j < k - 1; j++)/*将链表移到开始的位置*/
{
q = p;/*这一句是为了防止m=1的情况,m等于其他大于1的数,可以执行程序,m=1时,下面的操作有q,但是由于m=1;并没有进入for循环中,所以会导致没有q指针*/
p = p->next;
}
while (p->next != p)
{
for (i = 1; i < m; i++)/*用来点到第m个人*/
{
q = p;
p = p->next;
}/*点到了,跳出循环,下面就是删除了*/
printf("%d ", p->data);/*删除的数据*/
r = p;
q->next = q->next->next;
p = p->next;/*将下一轮的起点在这里确认*/
free(r);/*把结点空间释放*/
}
printf("%d ", p->data);/*还要把最后一个人的编号输出出来,要不然输出就会少一个*/
free(p);/*把剩下最后一个结点空间释放*/
}
void ListLoop(SingleLinkedList *head)/*制作循环单链表*/
{
LinkList p, q;
p = head;
while (p->next != NULL)
{
p = p->next;
}
p->next = head->next;/*这是循环的核心,尾头相连*/
}
源文件
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
#include "LinkedList.h"
#include<time.h>
int main()
{
printf("请输入一个最大编号n:");
int n, i, x,k,m;
LinkList head;
ListInitialize(&head);
scanf("%d", &n);
for (i = 0; i < n; i++)
ListInsert(head, i, i + 1);/*建环*/
ListLoop(head);/*将单链表做成循环单链表*/
/*for (i = 0; i < 15; i++)/*这是我用于检验链表是否循环了
{
printf("%d ", ListGet(head, i, &x));
}*/
printf("请输入一个出圈数m:");
scanf("%d", &m);
/*srand(time(0));*/
/*k = rand()% n+1;*/
k = 1;
printf("由系统自动生成开始的顺序,从第%d个人开始报数\n出圈的编号:",k);
ListDelete(head, k, m);
system("pause");
}
之前我的k值是随机数,没注意到有这个问题,当现在k=1,m=1的时候,就会在结果后面出现那个负数,到底是为什么呢,我检查了一下程序,没有发现问题,求大神指教