链表的增删改查及应用
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode* List;
struct LNode {
int Data;
List Next;
};
List MakeEmpty()
{
List Ptrl;
Ptrl = (List)malloc(sizeof(struct LNode));
Ptrl->Next = NULL;
return Ptrl;
}
List FindKth(int k, List Ptrl)
{
List p = Ptrl;
int i = 1;
while (p->Next != NULL && i < k) {
p = p->Next;
i++;
}
if (i == k)return p;
else return NULL;
}
List Find(int x, List Ptrl)
{
List p = Ptrl;
while (p != NULL && p->Data != x) {
p = p->Next;
}
return p;
}
List Insert(int x, int i, List Ptrl) {
List p, s;
if (i == 1) {
s = (List)malloc(sizeof(struct LNode));
s->Data = x;
s->Next = Ptrl;
return s;
}
p = FindKth(i - 1, Ptrl);
if (p == NULL) {
printf("It is wrong!");
return NULL;
}
else {
s = (List)malloc(sizeof(struct LNode));
s->Data = x;
s->Next = p->Next;
p->Next = s;
return Ptrl;
}
}
List Delete(int i, List Ptrl) {
List p, s;
if (i == 1) {
s = Ptrl;
if (Ptrl != NULL)Ptrl = Ptrl->Next;
else return NULL;
free(s);
return Ptrl;
}
p = FindKth(i - 1, Ptrl);
if (p == NULL) {
printf("第 % d个结点不存在", i - 1);
return NULL;
}
else if (p->Next == NULL) {
printf("第 % d个结点不存在", i);
return NULL;
}
else {
s = p->Next;
p->Next = s->Next;
free(s);
return Ptrl;
}
}
int main() {
int m;
int cs = 0;
while (scanf("%d", &m)) {
List myList1,myList2,p,q, myList3;
int count1 = 1, count2 = 1, n;
myList3 = (List)malloc(sizeof(struct LNode));
myList3->Next = NULL;
myList1 = (List)malloc(sizeof(struct LNode));
myList2 = (List)malloc(sizeof(struct LNode));
p = (List)malloc(sizeof(struct LNode));
q = (List)malloc(sizeof(struct LNode));
myList1->Next = NULL;
myList2->Next = NULL;
cs++;
if (m == -1)break;
while (m > 0)
{
int y;
scanf("%d", &y);
count1++;
Insert(y, count1, myList1);
m--;
}
scanf("%d", &n);
while (n > 0)
{
int y;
scanf("%d", &y);
count2++;
Insert(y, count2, myList2);
n--;
}
myList1 = myList1->Next;
myList2 = myList2->Next;
while (myList1 != NULL && myList2 != NULL)
{
if (myList1->Data <= myList2->Data)
{
p = myList1->Next;
myList1->Next = myList3->Next;
myList3->Next = myList1;
myList1 = p;
}
else
{
q = myList2->Next;
myList2->Next = myList3->Next;
myList3->Next = myList2;
myList2 = q;
}
}
if (myList1 != NULL)
{
p = myList1;
while (p != NULL)
{
q = p->Next;
p->Next = myList3->Next;
myList3->Next = p;
p = q;
}
}
if (myList2 != NULL)
{
q = myList2;
while (q != NULL)
{
p = q->Next;
q->Next = myList3->Next;
myList3->Next = q;
q = p;
}
}
int i, gcd = 0;
for (int i = 0; i < count1+count2 - 2; ++i)
for (p = myList3->Next; p->Next != NULL; p = p->Next)
{
if (p->Data > p->Next->Data)
{
gcd = p->Data;
p->Data = p->Next->Data;
p->Next->Data = gcd;
}
}
p = myList3->Next;
printf("Case%d:%d\n", cs, count1 + count2 - 2);
while (p)
{
printf("%d", p->Data);
printf(" ");
p = p->Next;
}
printf("\n");
cs++;
free(myList1);
free(myList2);
free(myList3);
}
return 0;
}