链表是最常见的一种线性数据结构,使用范围广。
在创建链表时,对不同节点之间的链接关系梳理清楚,这一点十分重要。。。
比如,下面开始试着用C语言来实现简单的链表操作:
链表的节点,可以按如下方式定义:
节点Node形象表示:
struct Node{
int value;
struct Node* next;
};
链表中插入节点,
void insertNode(int value)
{
/*建立新节点*/
struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
newNode->value=value;
newNode->next=NULL;
/*插入新节点*/
if(NULL==head)
/*头节点为空*/
{
head=newNode;
}
else
/*头节点不为空*/
{
newNode->next=head;
head=newNode;
}
}
链表中删除节点,
struct Node* deleteNode(int value)
{
struct Node* deleteNode=NULL;
if(NULL==head)
{
/*链表为空链表*/
return NULL;
} else {
/*链表不为空*/
if(value==head->value) {
/*删除头节点*/
deleteNode=head;
head=head->next;
} else {
/*删除非头节点*/
struct Node* preNode=head;
while((NULL!=preNode->next)&&(value!=preNode->next->value)){
/**/
preNode=preNode->next;
}
if(NULL==preNode->next) {
/*删除节点不存在*/
return NULL;
}
if(value==preNode->next->value){
/*删除节点*/
deleteNode=preNode->next;
preNode->next=preNode->next->next;
}
}
}
return deleteNode;
}
链表的长度,
int length_linkedlist()
{
struct Node* tmp=head;
int len_list=0;
while(NULL!=tmp)
{
tmp=tmp->next;
len_list++;
}
return len_list;
}
打印输出链表,
int *values=NULL;
int* printLinkedList()
/*打印输出链表*/
{
struct Node* tmp=head;
int len_list=length_linkedlist();
values=(int*)malloc(sizeof(int)*len_list);
int index=0;
while(NULL!=tmp)
{
values[index]=tmp->value;
tmp=tmp->next;
index++;
}
return values;
}
完整代码实现,可以参考下面的C程序,
// 作者:文方俊
// 日期:2020年11月02日
// 功能:C语言实现链表的基本操作
struct Node{
int value;
struct Node* next;
};
/*定义头指针head*/
struct Node* head=NULL;
void insertNode(int value)
{
/*建立新节点*/
struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
newNode->value=value;
newNode->next=NULL;
/*插入新节点*/
if(NULL==head)
/*头节点为空*/
{
head=newNode;
}
else
/*头节点不为空*/
{
newNode->next=head;
head=newNode;
}
}
struct Node* deleteNode(int value)
{
struct Node* deleteNode=NULL;
if(NULL==head)
{
/*链表为空链表*/
return NULL;
} else {
/*链表不为空*/
if(value==head->value) {
/*删除头节点*/
deleteNode=head;
head=head->next;
} else {
/*删除非头节点*/
struct Node* preNode=head;
while((NULL!=preNode->next)&&(value!=preNode->next->value)){
/**/
preNode=preNode->next;
}
if(NULL==preNode->next) {
/*删除节点不存在*/
return NULL;
}
if(value==preNode->next->value){
/*删除节点*/
deleteNode=preNode->next;
preNode->next=preNode->next->next;
}
}
}
return deleteNode;
}
int length_linkedlist()
{
struct Node* tmp=head;
int len_list=0;
while(NULL!=tmp)
{
tmp=tmp->next;
len_list++;
}
return len_list;
}
int *ptr=NULL;
static int count=0;
void insert(int data)
{
if(NULL==ptr)
{
/*从堆分配空间给第一个data单元*/
ptr=(int*)malloc(sizeof(int));
/*利用数组符号访问内存地址来存储数据*/
ptr[0]=data;
}
else
{
/*增加内存大小*/
ptr=(int*)realloc(ptr,sizeof(int)*(count+1));
ptr[count]=data;
}
}
int *values=NULL;
int* printLinkedList()
/*打印输出链表*/
{
struct Node* tmp=head;
int len_list=length_linkedlist();
values=(int*)malloc(sizeof(int)*len_list);
int index=0;
while(NULL!=tmp)
{
values[index]=tmp->value;
tmp=tmp->next;
index++;
}
return values;
}
void main()
{
// insertNode(1);
// insertNode(2);
// insertNode(3);
// insertNode(4);
// insertNode(5);
int i;
for(i=0;i<10;i++)
{
insertNode(i);
}
// deleteNode(9);
// deleteNode(3);
// deleteNode(0);
// for(i=5;i<10;i++)
// {
// deleteNode(i);
// }
int* values=printLinkedList();
int len_list=length_linkedlist();
printf("输出:");
for(i=0;i<len_list;i++)
{
printf("%2d", values[i]);
}
printf("\n");
}
未完待续,下一篇继续讲解链表的Python实现。。。
关注“遇见爱or遇见自己or遇见幸福”公众号二维码,第一回完,更多精彩下回待续。。。
遇见爱or遇见自己or遇见幸福
再出发,遇见更精彩的自己
。。。