【数据结构】----将一个链表拆分为两个链表

《算法设计与分析》课堂作业

将一个链表拆分为两个链表

要求:将一个链表1、2、3、4、5、6、7、8、9、10

拆分为1、3、5、7、9

和2、4、6、8、10这两个链表

思路:

方法呢很简单,就是在第一个结点,看第二个是否存在,若存在,就把第二个加入链表2,并在链表1中删去,然后移动到第三个结点,同样的,看第四个存在不,若存在,就加入链表2并删去,继续在第五个结点,判断第六个。。。

 

代码及注释:

#include
#include
#include
typedef struct LDataNode{
	int x;
	struct LDataNode *next;
}LDataNode;
typedef struct LHeadNode{
	LDataNode *next;
	LDataNode *tail;
}LHeadNode,*LinkList;

int InitList(LinkList *head){//初始化链表
	*head =(LinkList)malloc(sizeof(LHeadNode));
	LDataNode *vhNode =(LDataNode *)malloc(sizeof(LDataNode));
	if(*head==NULL||vhNode==NULL){
		return -1;//申请失败
	}
	vhNode->next=NULL;
	(*head)->next=vhNode;
	(*head)->tail=vhNode;
	return 0;
}
int AddList(LinkList *head,int a){//链表末尾添加元素
    LDataNode *vhNode =(LDataNode *)malloc(sizeof(LDataNode));
    if(vhNode==NULL){
		return -1;//申请失败
	}
	vhNode->x=a;
	vhNode->next=NULL;
	(*head)->tail->next=vhNode;//挂到末尾
	(*head)->tail=vhNode;//尾指针更新
	return 0;
}
int LTraverse(LinkList head){//遍历输出链表
	LDataNode *p=head->next->next;
	while(p){
		printf("%d ",p->x);
		p=p->next;
	}
	printf("\n");
	return 0;
}
int main(){
	LinkList head1;//初始化一个链表1
	InitList(&head1);

	//赋值为1-10
	for(int i=1;i<=10;i++){
        AddList(&head1,i);
	}

	LTraverse(head1);//遍历链表1

	LinkList head2;//申请链表2
	InitList(&head2);

	//将链表1拆成两个链表

	LDataNode *p=head1->next->next;//刚开始指向第一个结点
	while(p){
        if(p->next==NULL){  //如果下一个为空 就结束了
            p=p->next;
            break;
        }
        else{   //如果下一个不空 就把下一个删除并且加到链表2中
            int a=p->next->x;
            AddList(&head2,a);
            LDataNode *q=p->next->next;//删除
            p->next=q;

            p=p->next;
        }
	}
    //遍历操作之后的链表1和链表2
    LTraverse(head1);
    LTraverse(head2);
}

 

你可能感兴趣的:(数据结构(严蔚敏版))