#include <iostream>
using namespace std;
typedef char DataType;
struct node{
DataType data;
struct node *next;
};
typedef struct node ListNode;
typedef ListNode *LinkList;
//建空表(尾插法)
LinkList createR(){
LinkList head,rear;
head = NULL;rear = NULL;
ListNode *p;
char ch = getchar();
if (ch != '\n') {
p = (ListNode*)malloc(sizeof(ListNode));
p->data = ch;
if (head==NULL) {
head = p;
} else {
rear->next = p;
}
rear = p;
ch = getchar();
}
if (rear!=NULL) {
rear->next = NULL;
}
return head;;
}
//建立链表(带头结点的尾插法)
LinkList createR1(){
LinkList head = (LinkList)malloc(sizeof(LinkList));
ListNode *p,*rear;
char ch;
rear = head;
while ((ch = getchar()) != '\n') {
p = (ListNode*)malloc(sizeof(ListNode));
p->data = ch;
rear->next = p;
rear= p;
}
rear->next = NULL;
return head;
}
//插入(插入和删除操作都需要找i的前一个结点)
void insertList(LinkList head,int i,DataType x){
ListNode *p = head;
int j=0;
while (p && j<i-1) {
p = p->next;
j++;
}
if (p == NULL) {
cout << "插入位置错误" << endl;
} else {
ListNode *s = (ListNode*)malloc(sizeof(ListNode));
s->data = x;
s->next = p->next;
p->next = s;
}
}
//删除
DataType deleteList(LinkList head,int i){
//需要两个结点指针,一个指向i的前一个结点,一个指向i结点。
ListNode *p = head,*s=NULL;
int j=0;
while (p && j<i-1) {
p = p->next;
j++;
}
if (p == NULL) {
cout << "插入位置错误" << endl;
return NULL;
} else {
s = p->next;
DataType x = s->data;
p->next = s->next;
free(s);
return x;
}
}
//根据位置i查找(带头结点)
ListNode* getNodei(LinkList head,int i){
ListNode *p = head->next;
int j=1;
while(p != NULL && j<i){
p=p->next;
j++;
}
if (j==i) {
return p;
} else {
return NULL;
}
}
//根据元素x查找
ListNode* getNodex(LinkList head,DataType x){
ListNode *p = head->next;
while (p && x != p->data) {
p = p->next;
}
return p;
}
//返回表长(带头结点)
int getLength(LinkList p){
int length = -1;
while (p!=NULL) {
p = p->next;
length++;
}
return length;
}
//遍历输出链表数据
void showList(LinkList p){
while (p!=NULL) {
printf("%1c",p->data);
p = p->next;
}
cout << endl;
}
void split(LinkList a,LinkList b);
LinkList mergeList(LinkList La,LinkList Lb);
int main(int argc, const char * argv[]) {
// LinkList linklist = createR1();
// insertList(linklist, 2, 'w');
// showList(linklist);
//
// cout << "表长为" << getLength(linklist) << endl;
//
// ListNode *p = getNodei(linklist, 3);
// cout << "第3个元素是" << p->data << endl;
//
// ListNode *p1 = getNodex(linklist, 'b');
// cout << "b的元素是" << p1->data << endl;
//
// DataType ch = deleteList(linklist, 1);
// cout << "删除的元素是" << ch << endl;
//
// showList(linklist);
cout << "建表a" << endl;
LinkList a = createR1();
cout << "建表b" << endl;
LinkList b = createR1();
showList(a);
showList(b);
// split(a,b);
// showList(a);
// showList(b);
LinkList Lc = mergeList(a, b);
showList(Lc);
return 0;
}
//试写一算法,将一个头结点指针为a的带头结点的单链表A分解成两个单链表A和B,其中头结点指针分别为a和b,使得A链表中含有原链表A中序号为奇数的元素,B链表中含有原链表中序号为偶数的元素。并保持原来的顺序。
void split(LinkList a,LinkList b){
LinkList A=a,B=b;
ListNode *p;
p = a->next;
while (p != NULL) {
//奇数
A->next = p;
A = p;
p = p->next;
if (p) {
//偶数
B->next = p;
B = p;
p = p->next;
}
}
A->next = NULL;
B->next = NULL;
}
//假设头指针为La和Lb的单链表(带头结点)分别为线性表A和B的存储结构,两个链表都是按结点递增有序的。试写一算法,将两个单链表合并为一个有序链表Lc。
LinkList mergeList(LinkList La,LinkList Lb){
ListNode *pa = La->next;
ListNode *pb = Lb->next;
LinkList Lc = La;
LinkList pc = La;
while (pa!=NULL && pb!=NULL) {
if (pa->data<pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
if (pa==NULL) {
pc->next = pb;
free(La);
} else {
pc->next = pa;
free(Lb);
}
return Lc;
}