C语言实现qm法,线性表 ----链表的C语言实现

本人刚开始研究数据结构,欢迎拍砖!!!

ccfa82a22ffc8924be712ab849ddc989.gif

首先从最简单的线性表开始

1.线性表存储结构

a。顺序存储,最简单来说就是数组了吧,这里就不说了。

b。链式存储,就是来说链表了。

2.链表

在这里使用的是有head的链表,头部不含数据信息。

如图所示

3d2793a869da57bf5481e47c1db14ac1.png

首先是节点信息

//链表节点结构

typedef struct node{

int data; //节点值域

struct node* next;//节点指针域

}NODE;

下面介绍关于链表的简单操作,还是直接贴代码吧。。。

一共三个文件。

linkList.H

/************************************************************************/

/* 操作单链表,该链表带有头部空节点 */

/* */

/**********************************************************************/

//链表节点结构

typedef struct node{

int data; //节点值域

struct node* next;//节点指针域

}NODE;

//查找链表中第K个元素

//存在返回该节点指针,不存在返回null

NODE* find_List(NODE* head, int k);

//在第K个元素之前插入新的节点

NODE* insert_List(NODE* head, int k, int newItem);

//删除第K个节点

int delete_List(NODE* head, int k);

然后是linkList.cpp

#include "linkList.h"

#include

#include

NODE* find_List(NODE* head, int k){

if (k<1)

{

return NULL;

}

int i = 1;

NODE* p = head->next;

while( NULL != p && i < k)

{

p = p->next;

++i;

}

return p;

}

NODE* insert_List(NODE* head, int k, int newItem){

NODE* p;

NODE* s = (NODE*)malloc(sizeof(NODE));//创建新的节点

s->data = newItem;

if (k ==0 ) //空链表

{

head->next = s;

s->next = NULL;

return s;

}

else if (k == 1) //在第一个元素之前插入

{

p = head;

}else{

p = find_List(head,k-1);//查找第k-1个元素

}

if (p==NULL)

{

free(s);

return NULL;

}

s->next = p->next;

p->next = s;

return s;

}

int delete_List(NODE* head, int k){

NODE* p;

if (k==1)

{

p = head;

}else

{

p = find_List(head,k-1);

}

if (p==NULL || p->next == NULL) //表中不存在

{

return 0;

}

NODE* s = p->next;

p->next = s->next;

free(s);

return 1;

}

然后是一个测试。

#include "linkList.h"

#include

#include

int main(){

//构建链表

NODE* head = (NODE*)malloc(sizeof(NODE));

head->next = NULL;

for (int i = 0; i < 10; i++)

{

insert_List(head,i,i);

}

//打印所有节点

NODE* p = head->next;

while(p != NULL)

{

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

p = p->next;

}

//删除奇数位置节点

for(int j = 1; j<10; j = j+1)

{

delete_List(head,j);

}

//打印所有节点

p = head->next;

while(p != NULL)

{

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

p = p->next;

}

return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值