C语言的单链表基本操作
#ifndef HEAD_MENU_H
#define HEAD_MENU_H


#include"linknode.h"
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
void Initialize(linknode *a,int n);
void OutputLinknode(linknode *a,int n);
linknode *FindLinknode(linknode *a,int n);
linknode *ReserveLinknode(linknode *a,int n);
void Bubble_Sort(linknode *a,int n);
int Partition(linknode *a, int first, int end);
void Quick_Sort(linknode *a, int first, int end);
void Select_Sort(linknode *a,int n);
void Menu(linknode *a);


#endif HEAD_MENU_H


#ifndef LINKNODE_H
#define LINKNODE_H
#include <stdio.h>
struct linknode
{
int node;
linknode *next;
};


#endif LINKNODE_H


#include"Head_Menu.h"
void main()
{
printf("单链表排序及反转\n");
struct linknode *a;
a = (linknode*)malloc(sizeof(linknode));
a->node = NULL;
Menu(a);
getch();
}
void Initialize(linknode *a,int n)
{
int i;
linknode *p = a;
srand((unsigned)time(NULL));
for (i = 0; i < n; i++)
{
linknode *newnode = (linknode*)malloc(sizeof(linknode));
newnode->node = NULL;
p->node = rand() % 20 + 1;
p->next = newnode;
p = newnode;
}
}
void OutputLinknode(linknode *a,int n)
{
int i ;
printf("\n");
for(i = 0; i < n; i++)
{
printf("%d ",a->node);
a = a->next;
}
printf("\n\n");
}
void Menu(linknode *a)
{
printf("按任意键生成10个随机数(20以内)\n");
getch();
Initialize(a,10);
OutputLinknode(a,10);
printf("\n1.链表反转\n");
printf("2.冒泡排序\n");
printf("3.选择排序\n");
printf("4.快速排序\n");
printf("请输入操作号:");
char x = getch();
switch(x)
{
case '1':
{
linknode *p = ReserveLinknode(a,10);
OutputLinknode(p,10);
getch();
system("cls");
Menu(a);
}
case '2':
{
Bubble_Sort(a,10);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
case '3':
{
Select_Sort(a,10);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
case '4':
{
Quick_Sort(a, 0, 9);
OutputLinknode(a,10);
getch();
system("cls");
Menu(a);
}
default:
{
printf("输入有误");
getch();
exit(0);
}
}
}
linknode *FindLinknode(linknode *a,int n)
{
int i;
for(i = 0; i < n; i++)
{
a = a->next;
}
return a;
}
//链表反转
linknode *ReserveLinknode(linknode *a,int n)
{
int i;
linknode *p = FindLinknode(a,n - 1);
for(i = (n - 1); i != 0; i--)
{
FindLinknode(a,i)->next = FindLinknode(a,i - 1);
}
return p;
}
//冒泡排序
void Bubble_Sort(linknode *a,int n)
{
int i,j;
int temp;
for(i = 1; i < n; i++)
{
for(j = 0; j < n - i; j++)
{
if(FindLinknode(a,j)->node > FindLinknode(a,j+1)->node )
{
temp = FindLinknode(a,j)->node;
FindLinknode(a,j)->node = FindLinknode(a,j+1)->node;
FindLinknode(a,j+1)->node = temp;
}
}
}
}


//划分算法
int Partition(linknode *a, int first, int end)
{
    int i,j;
    int temp;
    i = first;
    j = end;


    while (i < j)
{
        //进行右侧扫描
        while (i < j&& FindLinknode(a,i)->node < FindLinknode(a,j)->node)
j--;
        if (i < j)
{
            temp = FindLinknode(a,i)->node;
            FindLinknode(a,i)->node = FindLinknode(a,j)->node;
            FindLinknode(a,j)->node = temp;
            i++;
        }
        //进行左侧扫描
        while (i < j && FindLinknode(a,i)->node <= FindLinknode(a,j)->node) 
i++;
        if (i < j)
{
            temp = FindLinknode(a,i)->node;
            FindLinknode(a,i)->node = FindLinknode(a,j)->node;
            FindLinknode(a,j)->node = temp;
            j--;
        }
    }
    return i;
}




void Quick_Sort(linknode *a, int first, int end)
{
    int pivot;
    if (first < end)
{
        pivot = Partition(a, first, end);
        Quick_Sort(a, first, pivot - 1);
        Quick_Sort(a, pivot + 1, end);
    }
}


void Select_Sort(linknode *a,int n)
{
int i,j;
int k;
int temp;
int swap;
for(i = 0;i < n - 1; i++)
{
temp = FindLinknode(a,i)->node;
k = i;
for (j = i + 1;j < n; j++)
{
if (temp >  FindLinknode(a,j)->node)
{
temp =  FindLinknode(a,j)->node;
k = j;
}
}
swap =  FindLinknode(a,i)->node;
FindLinknode(a,i)->node = FindLinknode(a,k)->node;
FindLinknode(a,k)->node = swap;
}
}

阅读更多
个人分类: C
想对作者说点什么? 我来说一句

单向链表的基本操作C语言

2017年05月01日 190KB 下载

没有更多推荐了,返回首页

不良信息举报

C语言的单链表基本操作

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭