当前位置:首页 » 编程语言 » c语言链表的实现

c语言链表的实现

发布时间: 2025-07-11 12:59:12

A. 如何用C 实现链表的查找、插入和删除

如何用C语言实现链表的查找、插入和删除,用C语言实现链表的查找、插入和删除的方法。

链表
C语言中链表有很多种,我们来讲C语言中最主要的链表——单向链表和双向链表的查找,插入,删除的实现方法。

单向链表
单链表使用按值查找,从链表的首元结点出发,依次将结点值和给定值e进行比较,返回查找结果。

其中单链表的查找的算法步骤是: 1.使用指针P指向首元结点 2.从首元结点开始依次顺着链域next向下查找,只要指向当前结点的指针P不为空,并且P所指结点的数据域不等于给定的值e,则循环执行“p指向下一个结点操作。 3.返回P。若查找成功,p此时即为结点的地址值,若查找失败,P返回NULL 具体代码如下。

SingleLinkList.h typedef int status;typedef int ElemType; //链表节点及链表数据表示定义typedef struct SingleLinkNode{ElemType data;struct SingleLinkNode *next;}SingleLinkNode,*SingleLinkList;//以下是单向链表操作函数原型 //初始化操作status InitSingleLinkList(SingleLinkList l);//链表销毁操作void DestroySingleLinkList(SingleLinkList l);//链表清除操作void ClearSingleLinkList(SingleLinkList l);//链表长度int SingleLinkListLength(SingleLinkList l); //链表是否为空bool SingleLinkListEmpty(SingleLinkList l); //取链表中的第i个元素status GetSingleLinkListElem(SingleLinkList l,int i,ElemType e); //在链表的第i个位置插入元素status InsertSingleLinkList(SingleLinkList l,int i,ElemType e);//删除链表的第i个元素status DeleteSingleLinkList(SingleLinkList l,int i); //打印链表void PrintSingleLinkList(SingleLinkList l);
SingleLinkList //必须包含此文件,因为它包含此文件中要用到的数据表示定义//以下实现的是带头节点的单向链表#include"SingleLinkList.h"#include"stdlib.h"#include"iostream.h"//初始化操作status InitSingleLinkList(SingleLinkList l){ //if(l)free(l); if(l=(SingleLinkList)malloc(sizeof(SingleLinkNode)))//如果分配成功,设置节点{l-next=NULL;return 1;}elsereturn 0;//表示失败 }//链表销毁操作void DestroySingleLinkList(SingleLinkList l){SingleLinkList p=l,q;while(p){q=p-next ;free(p);p=q;} }//链表清除操作void ClearSingleLinkList(SingleLinkList l){SingleLinkList p=l-next ,q;while(p){q=p-next ;free(p);p=q;}l-next =NULL; }//链表长度int SingleLinkListLength(SingleLinkList l){SingleLinkList p=l-next ;int i=0;if(l==NULL)return 0;while(p)i++,p=p-next; return i; } //链表是否为空bool SingleLinkListEmpty(SingleLinkList l){ return (l-next==NULL); } //取链表中的第i个元素status GetSingleLinkListElem(SingleLinkList l,int i,ElemType e){ int k=0;SingleLinkList p=l-next;if(i1||iSingleLinkListLength(l)) return 0;//1,寻找第i个节点 while(pki)k++,p=p-next; e =p-data ;return 1; } //在链表的第i个位置插入元素status InsertSingleLinkList(SingleLinkList l,int i,ElemType e){int k=0;SingleLinkList p,q ;if(SingleLinkListLength(l)==0)InitSingleLinkList(l);p=l ;if(i1||iSingleLinkListLength(l)+1) return 0;//1,寻找第i-1个节点 while(p-next ki-1)k++,p=p-next; //2,构造节点if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))return 0;//3,设置节点并将节点链入q-data =e;q-next =p-next ;p-next =q;return 1;}//删除链表的第i个元素status DeleteSingleLinkList(SingleLinkList l,int i){ int k=0;SingleLinkList p=l-next;if(i1||iSingleLinkListLength(l)) return 0;//1,寻找第i-1个节点 while(pki-1)k++,p=p-next; p-next =p-next-next ;free(p-next );return 1; } //打印链表void PrintSingleLinkList(SingleLinkList l){SingleLinkList p=l-next ;int i=1;while(p){coutp-data" " ;if(i%5==0)coutendl;p=p-next,i++ ;} }
Test #include"SingleLinkList.h"#includeiostream.h#includestdlib.h void main(void){ }

双链表
双链表的定义和各种操作实现方法,代码如下;

DualLinkList.h typedef int status;typedef int ElemType; //链表节点及链表数据表示定义typedef struct DualLinkListNode{ElemType data;struct DualLinkListNode *next;}DualLinkListNode,*DualLinkListList;//以下是单向链表操作函数原型 //初始化操作status InitDualLinkListList(DualLinkListList l);//链表销毁操作void DestroyDualLinkListList(DualLinkListList l);//链表清除操作void ClearDualLinkListList(DualLinkListList l);//链表长度int DualLinkListListLength(DualLinkListList l); //链表是否为空bool DualLinkListListEmpty(DualLinkListList l); //取链表中的第i个元素status GetDualLinkListListElem(DualLinkListList l,int i,ElemType e); //在链表的第i个位置插入元素status InsertDualLinkListList(DualLinkListList l,int i,ElemType e);//删除链表的第i个元素status DeleteDualLinkListList(DualLinkListList l,int i); //打印链表void PrintDualLinkListList(DualLinkListList l);

B. 用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找

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

typedef struct LNode{
int data; //链表数据
struct LNode* next; //链表指针
}LNode,*LinkList;

/*头插法-建立单链表*/
LinkList HeadCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode)); //建立头结点
la->next=NULL;
scanf("%d",&num);
while(num!=10)
{
LNode *p=(LinkList)malloc(sizeof(LNode));
p->data=num;
p->next=la->next;
la->next=p;
scanf("%d",&num);
}
return la;
}

/*尾插法-建立单链表*/
LinkList TailCreate(LinkList la)
{
int num;
la=(LinkList)malloc(sizeof(LNode));
la->next=NULL;
LinkList s,r=la;
scanf("%d",&num);
while(num!=10)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=num;
r->next=s;
r=s;
scanf("%d",num);
}
r->next=NULL;
return la;
}

/*单链表遍历*/
void TravelList(LinkList la)
{
LinkList p=la->next;
while(p!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("\n");
}

/*单链表的按位查找*/
LinkList GetElem(LinkList la,int i)
{
int j=1;
LNode* p=la->next;
if(i<1)
return NULL;
while(p && j<i)
{
p=p->next;
j++;
}
return p;
}

/*单链表的按值查找*/
LinkList LocalElem(LinkList la,int e)
{
LNode* p=la->next;
while(p!=NULL && p->data!=e)
p=p->next;
return p;
}

/*单链表插入操作*/
bool InsertList(LinkList la,int i,int e)
{
//在la链表中的i位置插入数值e
int j=1;
LinkList p=la,s;
while(p && j<i)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if((s=(LinkList)malloc(sizeof(LNode)))==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}

/*单链表删除操作*/
bool DeleteList(LinkList la,int i)
{
int j=1;
LinkList p=la,q;
while(p && j<i) //p指向第i-1个元素
{
p=p->next;
j++;
}
if(p==NULL || p->next==NULL) //表示不存在第i-1个和第i的元素
return false;
q=p->next;
p->next=q->next;
free(q);
return true;
}

/*单链表的表长*/
int LengthList(LinkList la)
{
int nLen=0;
LinkList p=la->next;
while(p)
{
p=p->next;
nLen++;
}
return nLen;
}

/*单链表逆置*/
LinkList Reserve(LinkList la)
{
if(la==NULL || la->next==NULL)
return la;
LinkList p=la->next,q=p->next,r=q->next;
la->next=NULL;
p->next=NULL;
while(r!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
la->next=q;
return la;
}

int main()
{
LNode la;
LinkList p;
p=HeadCreate(&la); //头插法创建单链表
TravelList(p);
printf("%p\n",GetElem(p,1)); //获得第1个结点地址
InsertList(p,2,10); //在链表的第2个位置插入元素10
TravelList(p);
DeleteList(p,3); //删除链表的第3个元素
TravelList(p);
printf("%d\n",LengthList(p)); //获得链表长度
p=Reserve(p);
TravelList(p);
return 0;
}

//运行结果
//5 6 12 7 8 14 9 3 2 5 14 10 头插法创建链表
//14->5->2->3->9->14->8->7->12->6->5-> 显示链表
//00382490 第一个结点的地址
//14->10->5->2->3->9->14->8->7->12->6->5-> 插入元素值为10的结点
//14->10->2->3->9->14->8->7->12->6->5-> 删除第三个结点
//11 获得链表长度
//5->6->12->7->8->14->9->3->2->10->14-> 链表逆置
//Press any key to continue

这是我写的一个线性表链式存储的综合程序,包含了你所要的创建、删除、插入、按值查找的功能,还有一些额外的功能。下面加注释的是程序运行结果,你可以参考试着改改程序,让程序更加完美。希望对你有帮助,呵呵!

C. 用C语言实现: (1)用头插法(或尾插法)建立带头结点的单链表;

C语言实现链表操作,具体包括链表的建立和数据的插入、删除。首先,定义了一个结构体,用于描述链表节点,每个节点包含整型数据和指向下一个节点的指针。

程序中使用了一个带头结点的单链表,通过头插法实现数据的插入。主函数中循环接受用户输入,选择插入或删除操作。插入操作时,用户需先输入要插入的数据个数,再逐一输入数据。程序会为每个输入的数据创建一个新的链表节点,并将其插入到链表头部。插入完成后,输出链表当前的数据内容。

删除操作时,用户输入要删除的值,程序遍历链表,找到匹配节点后,将其从链表中移除。删除操作完成后,输出链表当前的数据内容。如果链表中不存在该值,程序会提示用户。

通过这样的实现,可以动态地添加或移除链表中的元素,满足了基本的数据操作需求。头插法使得新插入的元素总是位于链表的最前端,方便管理和操作。

需要注意的是,每次操作后都需要更新链表的结构,确保链表的正确性。在实际应用中,可以根据需求选择不同的插入或删除方法,如尾插法,以适应不同的应用场景。

此外,程序中的错误处理也较为完善,当用户输入非法选项时,程序会提示错误并要求重新选择。这种机制有助于提高程序的健壮性和用户体验。

通过上述实现,可以灵活地对链表进行管理和操作,适用于多种场景,包括但不限于数据存储、搜索和排序等。

热点内容
如何配置组合音响 发布:2025-07-12 12:53:54 浏览:93
c语言幂计算 发布:2025-07-12 12:52:36 浏览:566
兔费WLAN密码多少 发布:2025-07-12 12:50:59 浏览:860
阿里云分布式存储 发布:2025-07-12 12:45:04 浏览:535
sql日志压缩 发布:2025-07-12 12:39:53 浏览:343
红点角标算法 发布:2025-07-12 12:11:16 浏览:844
开心消消乐服务器繁忙什么情况 发布:2025-07-12 12:11:14 浏览:239
数据库的封锁协议 发布:2025-07-12 12:10:35 浏览:725
如何配置一台长久耐用的电脑 发布:2025-07-12 11:43:03 浏览:602
昆明桃源码头 发布:2025-07-12 11:38:45 浏览:569