这是在vc6.0上敲的有关单链表的算法。
//单链表的创建、遍历、插入、删除、冒泡排序、逆序
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//定义单链表的结构体
typedef struct Node{
int data; //存放数据
struct Node *next; //存放指针
}NODE, *PNODE;
//创建单链表
PNODE CreateList(int len);
//遍历单链表
void TraverseList(PNODE pHead);
//单链表插入
bool InsertList(PNODE pHead, int pos, int val);
//单链表删除
bool DeleteList(PNODE pHead, int pos, int *val);
//冒泡排序之“升”法
void SortList1(PNODE pHead, int len);
//冒泡排序之“沉”法
void SortList2(PNODE pHead, int len);
//单链表逆序
void RverseList(PNODE pHead);
int main()
{
PNODE pHead = NULL;
int value;
int len;
printf("请输入链表的长度Len = ");
scanf("%d", &len);
pHead = CreateList(len);
TraverseList(pHead);
InsertList(pHead, 3, 36);
TraverseList(pHead);
if (DeleteList(pHead, 3, &value))
{
printf("%d\n", value);
}
TraverseList(pHead);
SortList1(pHead, len);
TraverseList(pHead);
RverseList(pHead);
TraverseList(pHead);
SortList1(pHead, len);
TraverseList(pHead);
return 0;
}
PNODE CreateList(int len)
{
int val;
PNODE pHead;
PNODE pTail;
pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("分配内存失败!\n");
exit(-1);
}
pTail = pHead;
for (int i = 0; i < len; i++)
{
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &val);
PNODE pNew;
pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("分配内存失败!\n");
exit(-1);
}
pNew->data = val;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead;
}
void TraverseList(PNODE pHead)
{
PNODE p;
if (NULL == pHead)
{
printf("分配内存失败!\n");
exit(-1);
}
p = pHead->next;
while(NULL != p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return;
}
bool InsertList(PNODE pHead, int pos, int val)
{
PNODE p = pHead->next;
PNODE pNew;
int i = 0;
if (NULL != p && i < pos-1)
{
p = p->next;
i++;
}
if (NULL == p->next || i > pos-1)
{
return false;
}
pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->next = p->next;
p->next = pNew;
return true;
}
bool DeleteList(PNODE pHead, int pos, int *val)
{
PNODE p = pHead->next;
PNODE q;
int i = 0;
if (NULL != p && i < pos-1)
{
p = p->next;
i++;
}
if (NULL == p->next || i > pos-1)
{
return false;
}
q = p->next;
*val = q->data;
p->next = q->next;
free(q);
q = NULL;
return true;
}
void SortList1(PNODE pHead, int len)
{
int i, j;
int temp;
PNODE p;
PNODE q;
for (i = 0, p=pHead->next; i < len-1; i++, p = p->next)
{
for (j = i+1, q = p->next; j < len; j++, q = q->next)
{
if ((p->data) > (q->data))
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
return;
}
void SortList2(PNODE pHead, int len)
{
int i, j;
PNODE q;
int temp;
for (i = 0; i < len-1; i++)
{
for (j = 0, q = pHead->next; j < len-i-1; q = q->next)
{
if ((q->data) > (q->next->data))
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
}
}
return;
}
void RverseList(PNODE pHead)
{
PNODE p = pHead->next;
PNODE q = p->next;
if (NULL == p || NULL == p->next)
{
return;
}
while (NULL != q)
{
PNODE t = q->next;
q->next = p;
p = q;
q = t;
}
pHead->next->next = NULL;
pHead->next = p;
return;
}