#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}SLNode;
void ListInitiate(SLNode **head)
{
*head = (SLNode *)malloc(sizeof(SLNode));
(*head)->next = NULL;
}
void ListInsertHead(SLNode *L)
{
SLNode *s;
int data;
printf("请输入链表元素:");
scanf_s("%d",&data);
while(data != -1)
{
s = (SLNode *)malloc(sizeof( SLNode));
s->data = data;
s->next = L->next;
L->next = s;
scanf_s("%d",&data);
}
}
void ListInsertTail(SLNode *L)
{
SLNode *s,*tail;
int data;
tail = L;
printf("请输入链表元素(输入-1结束):");
scanf_s("%d",&data);
while(data != -1)
{
s = (SLNode *)malloc(sizeof( SLNode));
s->data = data;
s->next = tail->next;
tail->next = s;
tail = s;
scanf_s("%d",&data);
}
}
SLNode* GetList(SLNode *L,int i)
{
SLNode *p;
int j = 0;
p = L;
if(i<1)
{
return NULL;
}
while(p->next != NULL && j<i)
{
p = p->next;
j++;
}
if(j == i)
{
return p;
}
return NULL;
}
int ListLength(SLNode *head)
{
SLNode *p = head;
int size = 0;
while(p->next != NULL)
{
p = p->next;
size++;
}
return size;
}
int ListInsert(SLNode *head,int i,DataType x)
{
SLNode *p,*q;
int j;
p=head;
j=0;
while(p->next != NULL && j<i-1)
{
p = p->next;
j++;
}
if(j !=i-1)
{
printf("插入元素位置参数错! ");
return 0;
}
q = (SLNode *)malloc(sizeof(SLNode));
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
int ListDelete(SLNode *head,int i,DataType *x)
{
SLNode *p,*s;
int j;
p = head;
j = 0;
while(p->next != NULL && j<i-1)
{
p = p->next;
j++;
}
if(j != i-1)
{
printf("删除元素位置参数错!");
return 0;
}
s = p->next;
*x = s->data;
p->next = p->next->next;
free(s); //释放其内存空间
return 1;
}
SLNode* marge(SLNode *L1,SLNode *L2)
{
SLNode *L3;
SLNode *pa,*pb,*r;
pa = L1->next;
pb = L2->next;
L3 = L1; //L3置为空表
r = L3;
L3->next = NULL;
while(pa != NULL && pb != NULL)
{
if (pa->data <= pb->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
if (pa)
{
r->next = pa;
}
else
{
r->next = pb;
}
free(L2);
return L3;
}
void printList(SLNode *L)
{
SLNode *p;
p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
SLNode *L1,*L2,*L3;
int p,i,a,b,x;
ListInitiate(&L1); //初始化
//ListInsertHead(L1); //头插
ListInsertTail(L1); //尾插
printList(L1); //输出
p = ListLength(L1); //长度
printf("链表长度:%d\n",p);
printf("请输入查找号:");
scanf_s("%d",&i);
SLNode *n = GetList(L1,i); //查找
printf("%d\n",*n);
printf("请输入被插入结点序号和插入元素(用逗号隔开):\n");
scanf_s("%d,%d",&a,&b);
int f = ListInsert(L1,a,b); //插入
printList(L1); //输出
printf("请输入被删除结点序号:");
scanf_s("%d",&a);
f = ListDelete(L1,a,&x); //删除
printList(L1); //输出
ListInitiate(&L2); //初始化L2
ListInsertTail(L2); //尾插L2
L3 = marge(L1,L2); //合并L1和L2
printList(L3);
return 0;
}