C语言实现链表操作
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef struct Student
{
int data;
struct Student * pNext;
} STU,*PSTU;
PSTU create_list();
void show_list(PSTU pHead);
void insert_list(PSTU pHead, int pos, int value);
void sort_list(PSTU pHead);
void find(PSTU pHead);
void delete_list(PSTU pHead);
void inversion_list(PSTU pHead);
bool is_empty(PSTU pHead);
void main()
{
PSTU pHead = NULL;
//int val ,pos ;
pHead=create_list();
printf("链表结点输出结果\n");
show_list(pHead);
printf("插入数据后的链表\n");
insert_list(pHead,2,10);
show_list(pHead);
find(pHead);
printf("\n");
printf("排序后的链表:\n");
sort_list(pHead);
show_list(pHead);
printf("删除操作:\n");
show_list(pHead);
delete_list( pHead );
printf("链表倒序输出:\n");
inversion_list(pHead);
}
PSTU create_list()
{
int len,i,value;
PSTU pHead = (PSTU)malloc(sizeof(STU));
PSTU pTail = pHead;
pTail->pNext = NULL;
printf("输入链表结点个数:");
scanf("%d",&len);
for(i = 0;i < len; i++)
{
PSTU pNode = (PSTU)malloc(sizeof(STU));
if(NULL == pNode)
{
printf("内存分配失败,请重新操作!\n");
exit(-1);
}
printf("输入第%d结点的数值:",i+1);
scanf("%d",&value);
pNode->data = value;
pTail->pNext = pNode;
pTail = pNode;
pTail->pNext = NULL;
}
return pHead;
}
void show_list(PSTU pHead)
{
PSTU pNode = pHead->pNext;
if(is_empty(pHead))
printf("该链表为空!\n");
else
{
while(pNode != NULL)
{
printf("%3d",pNode->data);
pNode = pNode->pNext;
}
printf("\n");
}
}
//在指定位置pos后插入一个值为value的新节点
void insert_list(PSTU pHead, int pos, int value)
{
PSTU pre = pHead;
PSTU pbh = NULL;
int i;
for(i = 0; i < pos; ++i)
pre = pre->pNext;//查找前驱结点指针
pbh = pre->pNext;//查找后继结点指针
PSTU pNew = (PSTU)malloc(sizeof(STU));
pNew->data = value;
pNew->pNext = pbh;
pre->pNext = pNew;
}
//排序: 交换的是结点的数据域,但能不能实现交换整个结点?
void sort_list(PSTU pHead)
{
PSTU p ,q ;
int t ;
for(p = pHead; p ->pNext!= NULL; p = p->pNext)
for(q = pHead; q->pNext != NULL;q = q->pNext)
{
if(q->data > q->pNext->data)
{
t = q->data;
q ->data = q->pNext->data;
q->pNext->data = t;
//printf("需要调换位置\n");
}
}
return;
}
void inversion_list(PSTU pHead)//ma de 终于搞定了!2015.1.20 22:00
{
PSTU p = pHead, q = pHead->pNext , r;
while(q->pNext != NULL )
{
r = q->pNext ;
q->pNext = p;
p = q;
q = r;
}
q->pNext = pHead;
pHead ->pNext = NULL;
//pHead->data = q->data;
printf("%d",q->data);
while (p ->pNext != NULL )
{
//printf("%");
printf("%3d",p->data);
p = p->pNext;
}
printf("\n");
}
//查询
void find(PSTU
pHead)
{
int type, i, val, pos,len = 0;
int value, m = 0;
bool flag =false;
PSTU p = pHead;
//printf("请选择查找类型:\n");
printf("\t******************************************\n");
printf("\t\t1:查找指定位置结点的数据\n");
printf("\t\t2:查找指定数据在链表中的位置\n");
printf("\t******************************************\n");
printf("请输入查找类型:");
scanf("%d",&type);
//if(type != 1 || type != 2)
// printf("您选择的查找类型不正确,请输入数字1或2!\n");
switch( type )
{
case 1:
{
printf("请输入欲查找的结点位置:");
scanf("%d",&pos);
//printf("您输入的查询位置是:%d",pos);
printf("\n");
while(p != NULL)
{
len++;
p = p->pNext;
}
p = pHead;
if(pos < 1 || pos > len)
{
printf("查找的位置超出链表的长度范围!\n");
//return false;
}
else if( pos > 0 && pos < len )
{
for(i = 0; i < pos; i++)
p = p->pNext;
value = p->data;
printf("第%d个结点的数字是: %d\n", pos, value);
//return true;
}
break;
}
case 2:
{
printf("请输入欲查找的数据: ");
scanf("%d",&val);
p = pHead->pNext;
i = 0;
while( p != NULL)
{
i++;
if(p->data == val)
{
flag = true;
m = i;
}
p = p->pNext;
}
if(flag)
printf("数据%d为该链表第%d个结点的数值\n",val,m);
else
printf("该数据不在链表中!\n");
break;
}
default : printf("您输入的类型不正确,请输入数字1或2!"); printf("\n"); break;
}
}
void delete_list(PSTU pHead)
{
PSTU p =pHead;
int val;
bool flag ;
printf("请输入需要删除的数据:");
scanf("%d",&val);
while( p -> pNext != NULL )
{
flag = false;
if(p->pNext->data == val)
{
// printf("***");
flag = true;
}
if( flag )
{
p->pNext = p->pNext->pNext;
}
p = p->pNext;
}
//if( flag == false)
// printf("链表中没有该数据结点!\n");
}
bool is_empty(PSTU pHead)
{
bool flag = false;
if(pHead->pNext == NULL)
flag = true;
return flag;
}