c语言关于链表的一道题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言关于链表的一道题相关的知识,希望对你有一定的参考价值。

6.链表的拆分和排序
题目描述
输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数。两个子链表中数据按照从小到大排序。
输入
第一行输入整数N;;
第二行依次输入N个整数。
输出
第一行分别输出偶数链表与奇数链表的元素个数;
第二行依次输出偶数子链表的所有数据;
第三行依次输出奇数子链表的所有数据。

示例输入

10
1 3 22 8 15 999 9 44 6 1001

示例输出

4 6
6 8 22 44
1 3 9 15 999 1001

#include<stdio.h>
#include<stdlib.h>

//整数单链表
struct numList

int num;
numList* next;
;

//函数原型声明
numList* create(int n);
int add(numList* head, int n);
void sort(numList* head);
void output(numList* head);

void main()

char* p;
p=NULL;
int count;
int evenCount = 0; //奇数个数
int oddCount = 0; //偶数个数
numList* list;
numList* evenList;
numList* oddList;
numList* pNode;
printf("输入整数个数及各整数值:\n");
scanf("%d",&count);

list = create(count);
evenList = (numList*)malloc(sizeof(numList));
evenList->next = NULL;
oddList = (numList*)malloc(sizeof(numList));
oddList->next = NULL;
pNode = list->next;
while(pNode != NULL)

if((pNode->num & 1) == 0)

//如果是偶数
evenCount++;
add(evenList, pNode->num);

else

//如果是奇数
oddCount++;
add(oddList, pNode->num);

pNode = pNode->next;

//对偶数和奇数链表排序
sort(evenList);
sort(oddList);

//输出
printf("%d %d\n",evenCount, oddCount);
output(evenList);
output(oddList);

/*************************************************
【函数名称】 create
【功能】 创建一个具有n个节点的单链表
【参数】 节点数
【返回值】 指向头节点的指针
*************************************************/
numList* create(int n)

numList* head;
numList* pCur;
numList* pNext;

head = (numList*)malloc(sizeof(numList));
if(head == NULL)

return NULL;

head->next = NULL;
pCur = head;
while(n>0)

pNext = (numList*)malloc(sizeof(numList));
if(pNext == NULL)

return NULL;

if(scanf("%d",&pNext->num)==0)
break;
pNext ->next = NULL;
pCur->next = pNext;
pCur = pNext;
n--;

return head;

/*************************************************
【函数名称】 add
【功能】 向链表末尾添加一个节点
【参数】 指向链表头节点的指针及添加元素的值
【返回值】 插入成功返回1,失败则返回0
*************************************************/
int add(numList* head, int n)

if(head == NULL)

return 0;

numList* p;
numList* pNewNode;
p = head;
while(p->next != NULL)

//得到尾既节点指针
p = p->next;

pNewNode = (numList*)malloc(sizeof(numList));
if(pNewNode == NULL)

return 0;

pNewNode->num = n;
pNewNode->next = NULL;
p->next = pNewNode;

return 1;


/*************************************************
【函数名称】 sort
【功能】 使用简单选择排序对节点元素升序排列
【参数】 指向链表头节点的指针及添加元素的值
【返回值】 无
*************************************************/
void sort(numList* head)

if(head == NULL)

return;

int temp;
numList* pStart;
numList* pCur;
for(pStart = head->next; pStart != NULL; pStart = pStart->next)

for(pCur = pStart->next; pCur != NULL; pCur = pCur->next)

if(pStart->num > pCur->num)

temp = pStart->num;
pStart->num = pCur->num;
pCur->num = temp;





/*************************************************
【函数名称】 output
【功能】 输出链表节点元素
【参数】 指向链表头节点的指针及添加元素的值
【返回值】 无
*************************************************/
void output(numList* head)

if(head == NULL)

return;

numList *p;
p = head->next;
while(p != NULL)

printf("%d ",p->num);
p = p->next;

printf("\n");
参考技术A //---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

typedef struct node

int data;
struct node *next;
node;
typedef struct

node *head;
node *end;
int cnt;
list;

void prt_list(list *a)

node *t=a->head;
while (t)

printf("%d ",t->data);
t=t->next;

putchar('\n');

void list_insert(list *a,int n)

node *t=malloc(sizeof(node));
t->data=n;
t->next=NULL;
if (a->end==NULL) a->head=a->end=t;
else
a->end->next=t;
a->end=t;

++a->cnt ;

void pickup_insert(list *a,int d)

node *s,*t=malloc(sizeof(node));
t->data=d;
t->next=NULL;
if (a->head==NULL)
a->head=a->end=t;

else if (d<a->head->data)
t->next=a->head;
a->head=t;

else if (d>a->end->data)
a->end->next=t;
a->end=t;

else
s=a->head;
while (s&&d>s->next->data)


s=s->next;


t->next=s->next;
s->next=t;

++a->cnt;

void list_pickup(list *a,list *even,list *odd)

node *t;
for (t=a->head; t!=NULL; t=t->next)
if (t->data%2) pickup_insert(odd,t->data);
else pickup_insert(even,t->data);


void delete_list(list *a)

node *t;
for (t=a->head; a->head!=NULL; t=a->head)
a->head=t->next;
free(t);


int main(int argc, char* argv[])


list even=0,odd=0,lt=0;
int i,n,a;
scanf("%d",&n);
for (i = 0; i < n; i++)
scanf("%d",&a);
list_insert(<,a);

list_pickup(<,&even,&odd);
printf("%d %d\n",even.cnt,odd.cnt);
prt_list(&even);
prt_list(&odd);
delete_list(&even);
delete_list(&odd);
return 0;

//---------------------------------------------------------------------------

以上是关于c语言关于链表的一道题的主要内容,如果未能解决你的问题,请参考以下文章

关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。

关于C语言链表的

C语言链表问题,作业编程。编好出现问题。高手看下。

[ 链表OJ题--C语言] 相交链表 两个链表的第一个公共结点

C语言编程问题

C语言链表的问题