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;

}

相关主题
相关文档
最新文档