/*
单链表的C语言实现
struct list {
usr_type key;
usr_type content;
... //自己根据需要增删
struct list *next;
};//usr_type 的类型你自己定义就好
实现单链表的创建、插入、删除、关键字查询、两个单链表的合并,尝试按关键字进行排序。
*/
#include <stdio.h>
#include <stdlib.h>
#define UserType int
#define N 5
/*定义单链表*/
typedef struct list
{
UserType key;
struct list *next;
} SLink;
void InitList(SLink *&sl);/*初始化线性表*/
SLink *CreateNode(UserType data);/*新建结点*/
void CreateList(SLink *&sl,UserType keyarray[],int n);/*创建链表*/
int InsElem(SLink *sl,UserType data,int location);/*插入节点*/
int DelElem(SLink *sl,int location);/*删除节点*/
int GetLength(SLink *sl);/*求链表长度*/
SLink *Locate(SLink *sl,UserType data);/*关键字查询*/
SLink* AddLink(SLink *&sl,SLink *sl2);/*两个单链表的合并*/
SLink* SortLink(SLink *&sl);/*按关键字进行排序*/
void PrinftList(SLink *sl);/*打印单链表的关键字*/
SLink* changenode(SLink *&sl,SLink *node1,SLink *node2);/*交换节点*/
void main()
{
UserType a[N]={8,2,9,4,5};
SLink *sl;
//InitList(sl);
CreateList(sl,a,N);
PrinftList(sl);
SortLink(sl);
PrinftList(sl);
c语言的冒泡排序算法}
/*初始化线性表,创建头结点,由sl指向它。
*sl在函数中指向的内容有所改变,使用引用型参数返回改变的值
*/
void InitList(SLink *&sl)
{
sl = (SLink *)malloc(sizeof(SLink));
sl->next = NULL;
}
/*
建立结点
*/
SLink *CreateNode(UserType data)
{
SLink *newnode;
newnode = (SLink *)malloc(sizeof(SLink));
newnode->key = data;
return newnode;
}
/*创建链表
头插法建表,从空表开始,读取关键字数组里的关键字,生成新结点,然后将新结点插入表头上
*/
void CreateList(SLink *&sl,UserType keyarray[],int n)
{
SLink *s;
InitList(sl);
for (int i = 0; i<n;i++ )
{
s = CreateNode(keyarray[i]);/*新建结点*/
s->next = sl->next ;
sl->next =s;
}
}
/*插入结点运算
先创建一个新结点*newnode,在单键表上到插入位置的前一个结点和其后的一个结点,
新结点*newnode的next指向后一个结点,插入位置的前一个结点next改为指向新结点*newnode
*/
int InsElem(SLink *sl,UserType data,int location)
{
int currentloction = 1;
SLink *newnode,*currentnode;
newnode = CreateNode(data) ;/*创建新节点*/
currentnode = sl;
if (location < 1 || location > GetLength(sl)+1)
return 0;        /*插入位置不正确,失败,返回0*/
while (currentloction<location)    /*在单键表上到插入位置的前一个结点*/
{
currentnode = currentnode->next ;
currentloction ++;
}
newnode ->next = currentnode ->next;
currentnode ->next = newnode;
return 1;          /*插入成功,返回1*/
}
/*删除结点运算
在单键表上到删除位置的前一个结点,
用currentnnode指向它,freenode指向要删除的结点。
*/
int DelElem(SLink *sl,int location)
{
int currentloction = 1;
SLink *freenode,*currentnode;
currentnode = sl;
if (location < 1 || location > GetLength(sl)+1)
return 0;        /*位置不正确,删除失败,返回0*/
while (currentloction<location)    /*在单键表上到删除位置的前一个结点*/
{
currentnode = currentnode->next ;
currentloction ++;
}
freenode = currentnode ->next ;
currentnode ->next = freenode ->next ;
free(freenode);
return 1;
}
/*
关键字查询。从第一个节点开始,从前向后比较关键字的值,返回关键字相等的结点的指针,没用到返回NULL
*/
SLink *Locate(SLink *sl,UserType data)
{
SLink *currentnode = sl->next ;
while (currentnode!=NULL && currentnode ->key !=data)/*从第1个结点开始查关键字为data的结点*/
{
currentnode = currentnode->next;
}
return currentnode; 
}
/*两个单链表的合并*/
SLink* AddLink(SLink *sl,SLink *sl2)
{
SLink* endsl;
endsl = sl;
while (endsl!=NULL)    /*在单键表上到s1的最后一个结点*/
{
endsl = endsl->next ;
endsl ++;
}
endsl ->next = sl2->next;
return sl;          /*全并成功,返回sl*/
}
/*交换节点。交换节点除Next指针外的元素*/
SLink* changenode(SLink *&sl,SLink *node1,SLink *node2)
{
UserType temp;
temp = node1->key ;
node1->key = node2 ->key ;
node2->key = temp;
return sl;
}
/*按关键字进行排序*/
SLink* SortLink(SLink *&sl)
{
int len;
len = GetLength(sl);
SLink *currentnode;
SLink *nextnode;
for(int j=0;j<len-1;j++)/*冒泡排序算法*/
{
currentnode = sl->next;
int exchange = 0;  /*交换标志*/
for(int i=0;i<len-1;i++)
{
nextnode = currentnode->next ;
if ((currentnode->key) > (nextnode ->key))
{
changenode(sl,currentnode,nextnode);/*交换两个节点*/
exchange = 1;
}
currentnode = currentnode ->next ;
}
if (exchange ==0)
return sl;
}
return sl;
}
/*求链表的长度*/
int GetLength(SLink *sl)
{
int len = 0;
SLink *p;
p = sl ->next;
while (p!=NULL)
{
len ++;
p = p ->next;
}
return len;
}
/*打印链表中的关键字*/
void PrinftList(SLink *sl)
{
SLink *p;
p = sl ->next;
while (p!=NULL)
{
printf("%4d",p->key );
p = p ->next;
}
printf("\n");
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。