#include
#include
typedef struct node {
int data;
struct node* next;
}Lnode, * LinkList;
float avgList(LinkList head)
{
float avg;
int sum = 0, count = 0;
LinkList p = (LinkList)malloc(sizeof(struct node));
p = head->next;
while (p != NULL)
{
sum += (p->data);
count++;
p = p->next;
}
avg = (float)sum / count;
return avg;
}
void splitList(LinkList head, LinkList odd, LinkList even)
{
head = head->next;
while (head != NULL)
{
if ((head->data) % 2 == 1)
{
odd->data = (head->data);
printf("odd=%d head=%d", odd->data, head->data);
odd = odd->next;
head = head->next;
}
else
{
even->data = head->data;
printf("even=%d head=%d", even->data, head->data);
even = even->next;
head = head->next;
}
}
even = NULL, odd = NULL;
}
void deleX(LinkList head, int x)
{
;
}
int main()
{
LinkList head, odd, even, p, q, p1;
head = (LinkList)malloc(sizeof(struct node));
odd = (LinkList)malloc(sizeof(struct node));
even = (LinkList)malloc(sizeof(struct node));
q = (LinkList)malloc(sizeof(struct node));
p1 = (LinkList)malloc(sizeof(struct node));
int a, b, flag = 1;
float avg;
q = head;
while (flag != 0)
{
p = (Lnode*)malloc(sizeof(struct node));
scanf("%d", &a);
if (a != 0)
{
p->data = a;
q->next = p;
q = p;
}
else
{
flag = 0;
q->next = NULL;
}
}
avg = avgList(head);
printf("平均值是:%.2f", avg);
p = (Lnode*)malloc(sizeof(struct node));
q = odd, p = even,p1=head;
splitList(p1, q, p);
printf("\nodd链表是:%d,%d", odd->next->data, even->next->data);
p = (Lnode*)malloc(sizeof(struct node));
p = odd->next;
printf("%d ", p->data);
printf("\nodd链表是:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
p = (Lnode*)malloc(sizeof(struct node));
p = even->next;
printf("%d ", p->data);
printf("\neven链表是:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return 0;
}
你只给原始链表分配了存储空间,而odd和even链表只分配了头结点的存储空间,第二次执行下面这行代码就会访问到非法地址的内存
odd->data = (head->data);
应该在拷贝奇偶数据时进行malloc,也就是下面的if块和else块
while (head != NULL)
{
if ((head->data) % 2 == 1)
{
odd->data = (head->data);
printf("odd=%d head=%d", odd->data, head->data);
odd = odd->next;
head = head->next;
}
else
{
even->data = head->data;
printf("even=%d head=%d", even->data, head->data);
even = even->next;
head = head->next;
}
}