###请在C++环境中运行
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node {
DataType data;
struct node* next;
}ListNode;
typedef ListNode* LinkList;
ListNode* p;
LinkList head;
//头插入法 没有头结点
LinkList CreateListF() {
LinkList head;
ListNode *p;
DataType ch;
head = NULL;
while ((ch = getchar()) != '\n')
{
p = (ListNode *)malloc(sizeof(ListNode));
if (p == NULL) {
return head;
}
p->data = ch;
p->next = head;
head = p;
}
return head;
}
//头插入法 有头结点
LinkList CreateListFT() {
LinkList headNode = (ListNode*)malloc(sizeof(ListNode));
if (headNode == NULL) {
return headNode;
}
LinkList head;
ListNode* p;
DataType ch;
head = NULL;
while ((ch = getchar()) != '\n')
{
p = (ListNode*)malloc(sizeof(ListNode));
if (p == NULL) {
return headNode;
}
p->data = ch;
p->next = head;
head = p;
}
headNode->next = head;
return headNode;
}
//尾插入法 带有头结点的
LinkList CreateListR() {
//申请一个头结点
LinkList head = (ListNode*)malloc(sizeof(ListNode));
ListNode * p, * r;
DataType ch = NULL;
r = head;
if (r == NULL) {
return head;
}
while ((ch = getchar()) != '\n') {
p = (ListNode*)malloc(sizeof(ListNode));
if (p == NULL){
return head;
}
p->data = ch;
r->next = p;
r = p;
}
r->next = NULL;
return head;
}
//查找運算帶有头结点 查找第i个元素
ListNode* GetNodei(LinkList head,int i) {
ListNode* p; int j;
p = head->next;
j = 1;
while (p != NULL && j<i){
p = p->next;
j++;
}
if (j == i){
return p;
}else {
return NULL;
}
}
//查找带有头结点的 按值查找
ListNode* LocateNodeK(LinkList head,DataType k) {
ListNode* p = head->next;//p指向开始结点
while ((p != NULL) && k!= p->data){
p = p->next;
}
return p;
}
//查找带有头结点的 插入
void InsertList(LinkList head,int i,DataType x) {
ListNode* p = head;
int j = 0;
while ((head != NULL)&& j<i-1){
p = p->next;
j++;
}
if (p == NULL){
printf("error\n");
return;
}else{
ListNode * s = (ListNode*)malloc(sizeof(ListNode));
if (s == NULL) {
printf("生成结点error\n");
return;
}
s->data = x;
s->next = p->next;
p->next = s;
}
}
//带有头结点的删除
DataType DeleteList(LinkList head, int i) {
DataType x;
ListNode* p,*s;
int j = 0;
p = head->next;
while ((p != NULL)&&j<i-1){
j++;
p = p->next;
}
if (p == NULL) {
printf("error\n");
exit(0);
}else {
s = p->next;
p->next = s->next;
x = p->data;
free(s);
return x;
}
}
//将链表拆分两个链表,A B A含有奇数序号的结点,B含有偶数序号的结点
void split(LinkList a,LinkList b) {
ListNode* p, * r,*s;
r = a;
s = b;
p = a->next;
while (p !=NULL) {
r->next = p;
r = p;
p = p->next;
if (p){
s->next = p;
s = p;
p = p->next;
}
}
r->next = s->next = NULL;
}
//假设头指针为La和Lb的单链表(带头结点) 分别为线性表的A和B的存储结构,两个链表都是按照结点值递增有序的
//式写一个算法将两个单链表合成一个有序的表LC
LinkList MergeList(LinkList la, LinkList lb) {
ListNode* pa, * pb,*h,* pc,*head;
pa = la->next;
pb = lb->next;
head =(ListNode*)malloc(sizeof(ListNode));
if (head == NULL) {
exit(0);
}
h = head;
while (pa!=NULL&&pb !=NULL) {
pc = (ListNode*)malloc(sizeof(ListNode));
if (pc == NULL) {
exit(0);
}
if (pa->data<=pb->data) {
pc->data = pa->data;
pc->next = pa->next;
head->next = pc;
head =pc;
pa = pa->next;
}else{
pc->data = pb->data;
pc->next = pb->next;
head->next = pc;
head = pc;
pb = pb->next;
}
}
head->next = pa!= NULL ? pa : pb;
free(lb);
free(la);
return h;
}
int main()
{
//LinkList head=CreateListF();
/*while (head != NULL)
{
putchar(head->data);
head = head->next;
}*/
/*
尾插入法遍历 带有头结点
LinkList head= CreateListR();
head = head->next;
while (head!=NULL)
{
putchar(head->data);
head = head->next;
}*/
//头插入法遍历 带有头结点
/*LinkList head = CreateListFT();
head = head->next;
while (head != NULL)
{
putchar(head->data);
head = head->next;
}*/
//尾插入法遍历 带有头结点 查找第i个元素
/*LinkList head= CreateListR();
ListNode* p = GetNodei(head, 3);
putchar(p->data);*/
//尾插入法遍历 带有头结点 按照值查找
//LinkList head = CreateListR();
没有值返回N
//DataType noValue = 'N';
//ListNode* p = LocateNodeK(head, 'r');
//if (p != NULL) {
// putchar(p->data);
//}else{
// putchar(noValue);
//}
//带头结点的插入
/*LinkList head = CreateListR();
InsertList(head, 3, 'w');
head = head->next;
while (head != NULL)
{
putchar(head->data);
head = head->next;
}*/
//带头结点删除
/*LinkList head = CreateListR();
DeleteList(head, 3);
head = head->next;
while (head != NULL)
{
putchar(head->data);
head = head->next;
}*/
//将链表拆分两个链表,A B A含有奇数序号的结点,B含有偶数序号的结点
/*LinkList head = CreateListR();
LinkList b =(ListNode*) malloc(sizeof(ListNode));
split(head, b);
head = head->next;
while (head != NULL)
{
putchar(head->data);
head = head->next;
}
printf("\n");
if(b !=NULL){
head = b->next;
while (head != NULL)
{
putchar(head->data);
head = head->next;
}
}*/
//假设头指针为La和Lb的单链表(带头结点) 分别为线性表的A和B的存储结构,两个链表都是按照结点值递增有序的
//式写一个算法将两个单链表合成一个有序的表LC
LinkList la = CreateListR();
LinkList lb = CreateListR();
LinkList lc = MergeList(la, lb);
while ((lc = lc->next) != NULL)
{
putchar(lc->data);
}
}