链表线性表及其操作c语言代码大全,用链表实现线性表的各种操作(C语言)

#include

# include

# include

//定义节点结构体

typedef struct Node

{

int data;//数据域

struct Node * pNext;//指针域

}NODE,* PNODE;

//函数声明

PNODE create_list(void); //创建链表

void traverse_list(PNODE pHead);//遍历链表

bool is_empty(PNODE pHead);//判断链表是否为空

int length_list(PNODE);//计算链表的长度

bool insert_list(PNODE, int, int);//插入数据

bool delete_list(PNODE, int, int *);//删除数据

void sort_list(PNODE); //链表排序

int main(void)

{

PNODE pHead=create_list();

traverse_list(pHead);

// printf("%d\n",length_list(pHead));

//insert_list(pHead,3 ,100);

//traverse_list(pHead);

// int val;

// delete_list(pHead,2,&val);

//traverse_list(pHead);

sort_list(pHead);

traverse_list(pHead);

return 0;

}

//创建链表函数实现

PNODE create_list(void)

{

int len;//存放有效节点的个数

int i;

int val ; //临时存放用回输入的节点的值

//创建头结点

PNODE pHead =(PNODE)malloc(sizeof(NODE));

if(NULL==pHead)

{

printf("分配内存失败,程序终止\n");

exit(-1);

}

PNODE pTail = pHead;//定义一个临时指针始终指向最后一个节点,辅助指针思想方法

pTail->pNext=NULL;

printf("请输入要生成的节点的个数:len=");

scanf("%d",&len);

for(i=0;i

{

printf("请输入第%d个节点的值:",i+1);

scanf("%d",&val);

PNODE pNew=(PNODE)malloc(sizeof(NODE));

if(NULL==pNew)

{

printf("分配失败,程序终止\n");

exit(-1);

}

pNew->data=val;

pTail->pNext=pNew;

pNew->pNext=NULL;

pTail=pNew;//注意点 pTail要移动

}

return pHead;

}

//遍历链表

void traverse_list(PNODE pHead)

{

PNODE p = pHead->pNext;

while (NULL != p)

{

printf("%d ", p->data);

p = p->pNext;

}

printf("\n");

return;

}

bool is_empty(PNODE pHead)//判断链表是否为空

{

if(NULL==pHead->pNext)

return true;

else

return false;

}

//计算链表的长度

int length_list(PNODE pHead)

{

int i=0;

PNODE p=pHead->pNext;

while(NULL!=p)

{

i++;

p=p->pNext;

}

return i;

}

//插入数据

bool insert_list(PNODE pHead , int pos , int val)

{

PNODE p=pHead;

if(pos>0&&pos<=(length_list(pHead)+1))

{

for(int i=0;i

{

p=p->pNext;

}

PNODE pNew = (PNODE)malloc(sizeof(NODE));

pNew->data=val;

PNODE temp=p->pNext;

p->pNext=pNew;

pNew->pNext=temp;

return true;

}

else

{

return false;

}

}

//删除数据

bool delete_list(PNODE pHead,int pos ,int *pVal)

{

PNODE p=pHead;

if(pos>0&&pos<=(length_list(pHead)))

{

for(int i=1;i

{

p=p->pNext;

}

PNODE temp=p->pNext->pNext;

*pVal=p->pNext->data;

p->pNext=temp;

return true;

}

else

{

return false;

}

}

//链表排序

void sort_list(PNODE pHead)

{

PNODE p=pHead;

for(p=pHead->pNext;p!=NULL;p=p->pNext)

{

for(PNODE q=p->pNext;q!=NULL;q=q->pNext)

{

if(q->datadata)

{

int temp=p->data;

p->data=q->data;

q->data=temp;

}

}

}

}

排序还可以用这种算法

void sort_list(PNODE pHead)

{

int i, j, t;

int len = length_list(pHead);

PNODE p, q;

for (i=0,p=pHead->pNext; ipNext)

{

for (j=i+1,q=p->pNext; jpNext)

{

if (p->data > q->data) //类似于数组中的: a[i] > a[j]

{

t = p->data;//类似于数组中的: t = a[i];

p->data = q->data; //类似于数组中的: a[i] = a[j];

q->data = t; //类似于数组中的: a[j] = t;

}

}

}

return;

}

数据插入还可用这种算法

bool insert_list(PNODE pHead, int pos, int val)

{

int i = 0;

PNODE p = pHead;

while (NULL!=p && i

{

p = p->pNext;

++i;

}

if (i>pos-1 || NULL==p)

return false;

PNODE pNew = (PNODE)malloc(sizeof(NODE));

if (NULL == pNew)

{

printf("动态分配内存失败!\n");

exit(-1);

}

pNew->data = val;

PNODE q = p->pNext;

p->pNext = pNew;

pNew->pNext = q;

return true;

}

数据删除还可用这种算法

bool delete_list(PNODE pHead, int pos, int * pVal)

{

int i = 0;

PNODE p = pHead;

while (NULL!=p->pNext && i

{

p = p->pNext;

++i;

}

if (i>pos-1 || NULL==p->pNext)

return false;

PNODE q = p->pNext;

*pVal = q->data;

//删除p节点后面的结点

p->pNext = p->pNext->pNext;

free(q);

q = NULL;

return true;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值