您的位置:首页 > 编程语言 > C语言/C++

c语言链表基本操作

2017-04-27 21:34 423 查看
对于c语言链表的增删改查

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>

#define true 1
#define false 0
typedef int bool;

typedef struct Node
{
int val;
struct Node * next;
}NODE,*PNODE;

//函数声明
void traverse_list(PNODE pHead);
PNODE create_list(void);
bool is_empty(PNODE);
int length_list(PNODE);
bool insert_list(PNODE,int,int);
bool delete_list(PNODE,int,int*);
void sort_list(PNODE);

//对链表元素进行排序
void sort_list(PNODE pHead)
{
int len = length_list(pHead);
if(len<=1)
{
printf("链表元素太少,无法执行排序操作");
return;
}
int i,j,temp;
PNODE p ; //现在 p 指向的是首节点
for(i=0;i<len;i++)
{
p = pHead->next; // 每一次循环执行时,需要从当前首节点向后执行
for(j=0;j<len-i-1;j++)
{
if(p->val < p->next->val)
{
temp = p->val;
p->val = p->next->val;
p->next->val = temp;
}
p = p->next;
}
}
}
//删除某个元素
bool delete_list(PNODE pHead ,int pos,int* val)
{
//以下的条件判断方法很巧妙
int i = 0;
PNODE p = pHead;
while(NULL!=p->next&&i<pos-1)
{
p= p->next;
i++;
}
if(i>pos-1 || NULL == p->next)
{
return false;
}
PNODE r = p->next; // 用 r 记住后,用来释放内存,防止内存泄露
*val = p->next->val;
p->next = p->next->next;
free(r);
r = NULL;
return true;

}

//插入某个元素
bool insert_list(PNODE pHead,int pos,int value)
{

int i = 0;
PNODE p = pHead;
while(NULL!=p->next&&i<pos-1)
{
p= p->next;
i++;
}
if(i>pos-1 || NULL ==p->next)
{
return false;
}
//程序执行到这个地方时,说明已经找到了要插入的位置
PNODE q = (PNODE)malloc(sizeof(NODE));
if(NULL == q)
{
printf("内存分配失败,程序将退出");
exit(-1);
}
q->val = value;
q->next = p->next;
p->next = q;
return true;

}

//求链表的长度
int length_list(PNODE pHead)
{
int len=0;
PNODE p = pHead;
while(NULL != p->next)
{
len++;
p = p->next;
}
return len;
}

bool is_empty(PNODE pHead)
{
if(NULL == pHead->next)
{
return true;
}
else
{
return false;
}
}

//构造链表
PNODE create_list(void)
{
int len,i,value;
printf("请输入您要创建的链表中的元素个数 len = ");
scanf("%d",&len);

PNODE pHead = (PNODE)malloc(sizeof(NODE)); // 最后需要返回的头指针
pHead->next=NULL;
PNODE pTail = pHead; // 最开始的时候尾指针指向头指针,因为元素个数为零。

for(i=0;i<len;i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //分配一个新节点
printf("请输入第%d个元素中的value值 value = ",i+1);
scanf("%d",&value);
pNew->val = value; //构造新节点的值
pNew->next = NULL; // 构造新节点的指针域
pTail->next = pNew; // 将新节点挂到尾节点上
pTail = pNew; //更新尾节点,新挂上的节点为尾节点
}

return pHead;
}
//遍历整个链表,并输出
void traverse_list(PNODE pHead)
{
PNODE p = pHead->next;
while(NULL != p)
{
printf("%d ",p->val);
p = p->next;
}
printf("\n");
}

//主函数
int main()
{

PNODE pHead = create_list();
traverse_list(pHead);
if(is_empty(pHead))
{
printf("empty\n");
}
else
{
printf("not empty\n");
}
printf("------------------------------------------\n");
int len = length_list(pHead);
printf("链表的长度为 %d \n",len);
printf("------------------------------------------\n");
int val,pos;
printf("请输入您要插入的位置 pos = ");
scanf("%d",&pos);
printf("请输入您要插入的数据 val = ");
scanf("%d",&val);
insert_list(pHead,pos,val);
printf("------------------------------------------\n");
printf("插入数据后的链表为\n");
traverse_list(pHead);
printf("------------------------------------------\n");
printf("请输入您要删除的元素的位置为:");
scanf("%d",&pos);
while(!delete_list(pHead,pos,&val))
{
printf("删除失败,请重新输入要删除元素的位置");
scanf("%d",&pos);
}
printf("删除后的链表遍历为:\n");
traverse_list(pHead);
printf("您删除的位置所在处的元素为:%d \n",val);
printf("------------------------------------------\n");

sort_list(pHead);
printf("排序后的链表输出为:\n");
traverse_list(pHead);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: