线性表链式存储结构的创建、删除最小值结点(值唯一)、删除某个指定值(不唯一)、就地逆置、反向输出、递增排序、删除重复结点、根据奇偶序号划分成两个带头结点的单链表。
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *llist;
void create(llist L); //创建链表
void delete_min(llist L); //删除最小值结点,该值唯一
void delete_same(llist L, int x); //删除某个指定值,且该值可能不唯一
void reverse(llist L); //就地逆置
void r_print(llist L); //反向输出
void sort(llist L); //递增排序
void delete_allsame(llist L); //删除数值重复的元素
void divide(llist L); //根据奇偶序号划分成两个单链表
int main()
{
llist L;
L = (llist)malloc(sizeof(LNode));
if(!L) return 0;
L->next = NULL;
create(L);
delete_min(L);
printf("删除数据域为5之后的单链表:\n");
delete_same(L, 5);
printf("就地逆置后的单链表:\n");
reverse(L);
printf("反向输出单链表:\n");
r_print(L);
printf("\n");
printf("递增排序后的单链表:\n");
sort(L);
printf("删除重复值后的单链表:\n");
delete_allsame(L);
divide(L);
return 1;
}
void create(llist L)
{
int a;
llist p, q;
scanf("%d", &a);
p = L;
while(a != 0)
{
do{
q = (llist)malloc(sizeof(LNode));
}while(!q);
q->data = a;
p->next = q;
p = p->next;
scanf("%d", &a);
}
p->next = NULL;
printf("创建后的单链表:\n");
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void delete_min(llist L)
{
int min;
llist p = L->next;
min = p->data;
for(p = p->next; p != NULL; p = p->next)
{
if(min > p->data)
min = p->data;
}
printf("链表中最小值为%d。\n", min);
}
void delete_same(llist L,int x)
{
llist p, q, s = L;
p = L->next;
while(p != NULL)
{
if(x == p->data)
{
q = p;
p = p->next;
s->next = p;
free(q);
}
else
{
s = p;
p = p->next;
}
}
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void reverse(llist L)
{
llist p, q;
p = L->next;
q = p->next;
while(q != NULL)
{
p->next = q->next;
q->next = L->next;
L->next = q;
q = p->next;
}
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void r_print(llist L)
{
llist p = L->next;
if(p != NULL)
r_print(p);
printf("%d ", L->data);
}
void sort(llist L)
{
llist p = L->next, q = p->next, pre;
p->next = NULL;
p = q;
while(p != NULL)
{
pre = L;
while(pre->next != NULL && pre->next->data < p->data)
pre = pre->next;
q = p->next;
p->next = pre->next;
pre->next = p;
p = q;
}
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void delete_allsame(llist L)
{
llist p;
p = L->next;
while(p->next != NULL)
{
if(p->data == p->next->data)
p->next = p->next->next;
else p = p->next;
}
for(p = L->next; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
void divide(llist L)
{
llist p, q, s, L1;
p = L->next;
q = L;
do{
L1 = (llist)malloc(sizeof(LNode));
}while(!L1);
s = L1;
while(p != NULL)
{
q->next = p;
q = q->next;
p = p->next;
if(p != NULL)
{
s->next = p;
s = s->next;
p = p->next;
}
}
q->next = NULL;
s->next = NULL;
printf("奇数序列的单链表:\n");
for(q = L->next; q != NULL; q = q->next)
printf("%d ", q->data);
printf("\n");
printf("偶数序列的单链表:\n");
for(s = L1->next; s != NULL; s = s->next)
printf("%d ", s->data);
printf("\n");
}