正文代码:
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
#include "LinList.h"
void Combine(SLNode *head1, SLNode *head2);
void InsertSort(int a[], int n);
void main(){
SLNode*head1, *head2;
DataType *p, *q;
int x, i, m = 0, n = 0;
ListInitiate(&head1);
ListInitiate(&head2);
//建立第一个链表接收从键盘输入的数据
printf("请输入任意个数的据元素完成第一个链表:\n");
while(scanf("%d", &x))
{
ListInsert(head1,m, x);
m++;
}
printf("\n");
//建立第二个链表接收从键盘输入的链表数据
printf("请输入任意个数的数据元素完成第二个链表:\n");
getchar();
while(scanf("%d",&x))
{
ListInsert(head2,n, x);
n++;
}
//显示当前链表数据元素
printf("链表一的数据元素为:");
for(i= 0; i < ListLength(head1); ++i)
{
ListGet(head1,i, &x);
printf("%d ", x);
}
printf("\n");
printf("链表二的数据元素为:");
for(i= 0; i < ListLength(head2); ++i)
{
ListGet(head2,i, &x);
printf("%d ", x);
}
printf("\n");
//合成两个链表
Combine(head1,head2);
}
void Combine(SLNode *head1, SLNode *head2)
{
SLNode*com, *p, *q, *r, *s;
int i = 0, x;
DataType *a;
a= (DataType *)malloc(sizeof(DataType)*(ListLength(head1)+ListLength(head2)));
ListInitiate(&com);
r= head1;
s= head2;
p= head1->next;
q= head2->next;
if(ListLength(head1)>= ListLength(head2))
{
while(q->next!= NULL)
{
r= p;
p= p->next;
r->next= q;
s= q;
q= q->next;
s->next= p;
}
r= p;
p= p->next;
r->next= q;
q->next= p;
//将以head1为头节点的链表中的数据元素输出
printf("将以head1为头节点的链表中的数据元素输出:");
for(i= 0; i <ListLength(head1); ++i)
{
ListGet(head1,i, &x);
printf("%d ", x);
}
printf("\n");
//将链表head1数据放入data数组中并排序
for(i= 0; i < ListLength(head1); ++i)
{
ListGet(head1,i, &a[i]);
}
InsertSort(a,ListLength(head1));
//将排序后的数据元素按序放入新建的链表com中并输出
for(i= 0; i < ListLength(head1); ++i)
ListInsert(com,i, a[i]);
printf("排序后的链表com数据元素分别显示为:");
for(i= 0; i < ListLength(com); ++i)
{
ListGet(com,i, &x);
printf("%d ", x);
}
printf("\n");
}
else{
while(p->next!= NULL)
{
s= q;
q= q->next;
s->next= p;
r= p;
p= p->next;
r->next= q;
}
s= q;
q= q->next;
s->next= p;
p->next= q;
//将以head2为头节点的链表中的数据元素输出
printf("将以head2为头节点的链表中的数据元素输出:");
for(i= 0; i <ListLength(head2); i++)
{
ListGet(head2,i, &x);
printf("%d ", x);
}
printf("\n");
//将链表head2数据放入data数组中并排序
for(i= 0; i < ListLength(head2); ++i)
{
ListGet(head2,i, &a[i]);
}
InsertSort(a,ListLength(head1));
//将排序后的数据元素按序放入新建的链表com中并输出
for(i= 0; i < ListLength(head2); ++i)
ListInsert(com,i, a[i]);
printf("排序后的链表com数据元素分别显示为:");
for(i= 0; i < ListLength(com); ++i)
{
ListGet(com,i, &x);
printf("%d ", x);
}
printf("\n");}}
//直接插入排序
void InsertSort(DataType a[], int n)
{
int i, j;
int temp;
for(i= 0; i < n-1; i++)
{temp = a[i+1];
j= i;
while(j> -1&& temp < a[j])
{
a[j+1]= a[j];
a[j]= temp;
j--;}}}
头文件 “linlist.h”
#include <stdlib.h>
typedef int DataType;
#include <malloc.h>
typedef struct Node
{
DataType data;
struct Node *next;
} SLNode;
typedef int DataType;
#include <malloc.h>
typedef struct Node
{
DataType data;
struct Node *next;
} SLNode;
void ListInitiate(SLNode **head) /*初始化*/
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
(*head)->next = NULL; /*置链尾标记NULL */
}
{
/*如果有内存空间,申请头结点空间并使头指针head指向头结点*/
if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
(*head)->next = NULL; /*置链尾标记NULL */
}
int ListLength(SLNode *head)
{
SLNode *p = head; /*p指向首元结点*/
int size = 0; /*size初始为0*/
{
SLNode *p = head; /*p指向首元结点*/
int size = 0; /*size初始为0*/
while(p->next != NULL) /*循环计数*/
{
p = p->next;
size ++;
}
return size;
}
{
p = p->next;
size ++;
}
return size;
}
int ListInsert(SLNode *head, int i, DataType x)
/*在带头结点的单链表head的数据元素ai(0 ≤ i ≤ size)结点前*/
/*插入一个存放数据元素x的结点*/
{
SLNode *p, *q;
int j;
/*在带头结点的单链表head的数据元素ai(0 ≤ i ≤ size)结点前*/
/*插入一个存放数据元素x的结点*/
{
SLNode *p, *q;
int j;
p = head; /*p指向首元结点*/
j = -1; /*j初始为-1*/
while(p->next != NULL && j < i - 1)
/*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
j = -1; /*j初始为-1*/
while(p->next != NULL && j < i - 1)
/*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
if(j != i - 1)
{
printf("插入位置参数错!");
return 0;
}
{
printf("插入位置参数错!");
return 0;
}
/*生成新结点由指针q指示*/
if((q = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
q->data = x;
if((q = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
q->data = x;
q->next = p->next; /*给指针q->next赋值*/
p->next = q; /*给指针p->next重新赋值*/
return 1;
}
p->next = q; /*给指针p->next重新赋值*/
return 1;
}
int ListDelete(SLNode *head, int i, DataType *x)
/*删除带头结点的单链表head的数据元素ai(0 ≤ i ≤ size - 1)结点*/
/*删除结点的数据元素域值由x带回。删除成功时返回1;失败返回0*/
{
SLNode *p, *s;
int j;
/*删除带头结点的单链表head的数据元素ai(0 ≤ i ≤ size - 1)结点*/
/*删除结点的数据元素域值由x带回。删除成功时返回1;失败返回0*/
{
SLNode *p, *s;
int j;
p = head; /*p指向首元结点*/
j = -1; /*j初始为-1*/
while(p->next != NULL && p->next->next!= NULL && j < i - 1)
/*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
j = -1; /*j初始为-1*/
while(p->next != NULL && p->next->next!= NULL && j < i - 1)
/*最终让指针p指向数据元素ai-1结点*/
{
p = p->next;
j++;
}
if(j != i - 1)
{
printf("插入位置参数错!");
return 0;
}
{
printf("插入位置参数错!");
return 0;
}
s = p->next; /*指针s指向数据元素ai结点*/
*x = s->data; /*把指针s所指结点的数据元素域值赋予x*/
p->next = p->next->next; /*把数据元素ai结点从单链表中删除指*/
free(s); /*释放指针s所指结点的内存空间*/
return 1;
}
*x = s->data; /*把指针s所指结点的数据元素域值赋予x*/
p->next = p->next->next; /*把数据元素ai结点从单链表中删除指*/
free(s); /*释放指针s所指结点的内存空间*/
return 1;
}
int ListGet(SLNode *head, int i, DataType *x)
/*取数据元素ai和删除函数类同,只是不删除数据元素ai结点*/
{
SLNode *p;
int j;
/*取数据元素ai和删除函数类同,只是不删除数据元素ai结点*/
{
SLNode *p;
int j;
p = head;
j = -1;
while(p->next != NULL && j < i)
{
p = p->next; j++;
}
j = -1;
while(p->next != NULL && j < i)
{
p = p->next; j++;
}
if(j != i)
{
printf("取元素位置参数错!");
return 0;
}
{
printf("取元素位置参数错!");
return 0;
}
*x = p->data;
return 1;
}
return 1;
}
void Destroy(SLNode **head)
{
SLNode *p, *p1;
{
SLNode *p, *p1;
p = *head;
while(p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}
while(p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}