单链表的C语言实现

/*
单链表的C语言实现
struct list {
usr_type key;
usr_type content;
... //自己根据需要增删
struct list *next;
};//usr_type 的类型你自己定义就好
实现单链表的创建、插入、删除、关键字查询、两个单链表的合并,尝试按关键字进行排序。
*/


#include
#include
#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);

}

/*初始化线性表,创建头结点,由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{
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{
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{
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{
currentnode = sl->next;
int exchange = 0; /*交换标志*/
for(int i=0;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");
}

相关文档
最新文档