//
// main.c
// sqlist
//
// Created by Mac on 16/8/1.
// Copyright ? 2016年 Mac. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}LNode,*LinkList;
void BuildLinkList(LinkList l)// 创建链表
{ int n;
LinkList p,q;
p = l;
printf("请输入n和n个元素\n");
scanf("%d",&n);
while (n--) {
q = (LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
q->next = NULL;
p->next = q;
p = q;
}
}
void LinkListLength(LinkList l)//求长度
{ int num = 0;
LinkList p;
p = l->next;
while (p) {
num++;
printf("%3d",p->data);
p = p->next;
}
printf("链表长度为%d",num);
}
void FindLinkList(LinkList l,int x)//查找前驱节点
{ LinkList p;
p = l;
while (p->next && p->next->data!=x)
p = p->next;
if (p->next) {
printf("%d的前驱结点为%d",x,p->data);
}
}
void DeleteLinkList(LinkList l,int x)//删除节点
{ LinkList p,q;
p = l;
while (p->next && p->next->data!=x) {
p = p->next;
}
if(p->next){
q = p->next;
p->next = q->next;
free(q);
}
printf("删除元素成功");
}
void ReserveLinkList(LinkList l)//逆置
{ LinkList p,q;
p = q = l->next;
l->next = NULL;
while (p) {
q = q->next;
p->next = l->next;
l->next = p;
p = q;
}
printf("逆置成功");
}
void SortLinkList(LinkList l)//排序
{ LinkList p,q;
int temp;
p=l;
for(p=l;p->next!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
if(p->data>q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
printf("排序成功!");
}
void Deletesameelem(LinkList l)//删除相同的元素
{
LinkList p,q,s;
p=l;
q=l->next;
while(q->next)
{
if(q->data ==q->next->data)
{
p->next=q->next;
s=q;
q=q->next;
free(s);
}
else
{
p=p->next;
q=q->next;
}
}
printf("删除成功!!");
}
void Insert(LinkList l,LinkList p)//插入元素,仍有序
{
LinkList s;
s=l;
while(s->next && s->next->data<p->data)
s=s->next;
p->next=s->next;
s->next=p;
}
void Tips()//提示
{
printf("\n");
printf("根据按键选择相应的操作:\n");
printf("<1>输出单链表及其长度:\n");
printf("<2>查找值为x的直接前驱结点:\n");
printf("<3>删除值为x的结点:\n");
printf("<4>将表中的元素逆置:\n");
printf("<5>将单链表由小到大进行排序:\n");
printf("<6>删除表中相同的元素:\n");
printf("<7>在升序链表中插入元素x:\n");
printf("<0>退出:\n");
}
int main(int argc, const char * argv[]) {
int operate,x;
LinkList L,p;
L= (LinkList)malloc(sizeof(LNode));
L->next = NULL;
L->data = -1;//初始化
BuildLinkList(L);
Tips();
scanf("%d",&operate);
while(operate)
{
switch(operate)
{
case 1:LinkListLength(L);
break;
case 2:
printf("请输入要查找的元素x:\n");
scanf("%d",&x);
FindLinkList(L,x);
break;
case 3:
printf("请输入要删除的元素x:\n");
scanf("%d",&x);
DeleteLinkList(L,x);
break;
case 4:ReserveLinkList(L);
break;
case 5:SortLinkList(L);
break;
case 6:Deletesameelem(L);
break;
case 7:
printf("请输入要插入的元素X:\n");
scanf("%d",&x);
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
Insert(L,p);
printf("插入成功!!!\n\n");
break;
}
scanf("%d",&operate);
}
}
单链表基本操作
最新推荐文章于 2022-07-19 20:22:32 发布