#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* next;
}Node, *LinkList;
void InitList(LinkList *L);//初始化空链表
int LengthList(LinkList L);//求链表长度
void TailList(LinkList L);//尾插法建立链表数据
void HeadList(LinkList L);//头插法建立链表数据
int GetData(LinkList L, int i);//获得第i个位置的数据
int GetLocate(LinkList L, int data);//查找第一次出现数据data的位置
void InsList(LinkList L, int i, int data);//在第i个位置插入数据data
void DelList(LinkList L, int i);//删除第i个元素
void DestroyList(LinkList L);//销毁链表L
bool EmptyList(LinkList L);//判断是否为空
void PrintList(LinkList L);//打印链表L
LinkList MergeLinkList(LinkList A, LinkList B);//按从小到大合并链表A,B
int main(){
LinkList head, linkB;
int i, data;
InitList(&head);//head初始化
InitList(&linkB);//linkB初始化
TailList(head);//尾插法建立链表head
HeadList(linkB);//头插法建立链表linkB
printf("尾插法链表如下,长度为%d:\n", LengthList(head));
PrintList(head);//打印链表head
printf("头插法链表如下,长度为%d:\n", LengthList(linkB));
PrintList(linkB);
printf("请输入想查看链表head数据的位置:\n");
scanf("%d", &i);
printf("head链表中第i个位置数据为:%d\n", GetData(head, i));
printf("请输入想查看链表head的数据:\n");
scanf("%d", &data);
printf("head链表中数据为data的第一个位置为:%d\n", GetLocate(head, data));
printf("请输入插入位置以及数据:\n");
scanf("%d %d", &i, &data);
InsList(head, i, data);
PrintList(head);
printf("请输入想删除的数据位置:\n");
scanf("%d", &i);
DelList(head, i);
PrintList(head);
head = MergeLinkList(head, linkB);
PrintList(head);
DestroyList(head);
PrintList(head);
}
void InitList(LinkList *L){//初始化空链表
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
void TailList(LinkList L){//尾插法建立链表
Node *r, *temp;
r = L;
int data;
printf("尾插法建立链表,-1结束\n");
scanf("%d", &data);
while(data != -1){
temp = (Node *)malloc(sizeof(Node));
temp->data = data;
r->next = temp;
r = temp;
scanf("%d", &data);
}
r->next = NULL;
}
void HeadList(LinkList L){//头插法建立链表
Node *h, *temp;
h = L;
int data;
printf("头插法建立链表,-2结束\n");
scanf("%d", &data);
while(data != -2){
temp = (Node *)malloc(sizeof(Node));
temp->data = data;
temp->next = h->next;
h->next = temp;
scanf("%d", &data);
}
}
int LengthList(LinkList L){//返回链表长度,不包括头结点
Node *p = L->next;
int length = 0;
if(EmptyList(L))
printf("空链表!求长错误!\n");
else
while(p != NULL){
length++;
p = p->next;
}
return length;
}
bool EmptyList(LinkList L){//判断单链表是否为空
Node *p = L;
if(L->next == NULL)
return true;
else
return false;
}
int GetData(LinkList L, int i){//获得第i个位置的数据
Node *p = L->next;
int locate = 1;
int data = -1;
if(i <= 0 || i > LengthList(L))
printf("位置不在链表范围!\n");
else{
while(p != NULL){
if(locate == i){
data = p->data;
break;
}else{
p = p->next;
locate++;
}
}
}
return data;
}
int GetLocate(LinkList L, int data){//找第一次出现数据data的位置
int i = 1, locate = -1;
Node *p = L->next;
while(p != NULL){
if(p->data != data){
i++;
p = p->next;
}else{
locate = i;
break;
}
}
if(p == NULL)
printf("该数据未在此链表中出现!\n");
return locate;
}
void InsList(LinkList L, int i, int data){//在第i个位置插入数据data
Node *pre = L, *tmp;
int k = 0;
if(i <= 0 || i > LengthList(L)+1)
printf("插入位置异常,插入操作无效!\n");
else{
while(k++ < i-1)
pre = pre->next;
tmp = (Node *)malloc(sizeof(Node));
tmp->data = data;
tmp->next = pre->next;
pre->next = tmp;
}
}
void DelList(LinkList L, int i){//删除第i个元素
Node *pre = L, *tmp;
int k = 0;
if(i <= 0 || i > LengthList(L))
printf("删除位置异常,删除操作无效!\n");
else{
while(k++ < i-1)
pre = pre->next;
tmp = pre->next;
pre->next = tmp->next;
free(tmp);
}
}
void PrintList(LinkList L){//打印链表L
if(EmptyList(L)){
printf("此链表为空!\n");
}else{
Node *p = L->next;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
LinkList MergeLinkList(LinkList A, LinkList B){//按从小到大合并链表A,B
Node *pa, *pb;
LinkList C, r;
pa = A->next;
pb = B->next;
r = C = A;
while(pa != NULL && pb != NULL)
if(pa->data < pb->data){
C->next = pa;
C = pa;
pa = pa->next;
}else{
C->next = pb;
C = pb;
pb = pb->next;
}
if(pa != NULL)
C->next = pa;
else
C->next = pb;
free(B);
return r;
}
void DestroyList(LinkList L){//销毁链表L
L->next = NULL;
}