C单链表

蟲蟲O_O 蟲蟲O_O 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
c的纯新手,看了两天书,对于指针链表还是搞不清楚,觉得再怎么想也无济于事,于是动手开始写,花了一下午把下面的单链表操作写完了,希望各位给些帮助,支出不妥和优化的地方,在此谢谢各位帮助了
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int data;
struct node *next;
}NODE ;
//创建链表
NODE *CreateLink(int len);
//查看链表
void DisplayLink( NODE *head );
//查看链表长度
int GetLinkLen( NODE *head );
//根据位置查找
void FindItemByPosition( NODE *head, int position );
//根据内容查找
void FindItem( NODE *head ,int value );
//插入节点
NODE *InsertItem( NODE *head, int position, int value );
//删除节点
NODE *DelItem( NODE *head, int value );
//根据位置删除节点
NODE *DelItemByPosition( NODE *head, int position );
//删除链表
void DelLink( NODE *head );

/**创建链表**/
NODE *CreateLink( int len ){
NODE *head,*current,*temp;//头节点指针,当前指针,创建指针
if( len == 0 ) return NULL;//长度为零,返回空指针
head = (NODE *)malloc( sizeof (NODE));
head->data = 0;
head->next = NULL;
if( len == 1 ) return head;//长度为1,返回头节点
current = head;//当前指针指向头节点
for( int i =1; i < len; i++ ){
temp = (NODE *)malloc( sizeof (NODE));//分配内存,并将当前指针的next指向内存
temp->data = i;
temp->next = NULL;
current->next = temp;//表示将current所指向的节点的next指向temp
current = temp;//表示将current指针移向新生成的节点temp
}
return head;
}

/**查看指针长度**/
int GetLinkLen( NODE *head ){
NODE *current;//当前指针
current = head;//将当前指针指向头结点
int len = 0;
while( current != NULL ){
len++;
current = current->next;//指针后移
}
return len;
}

/**查看链表**/
void DisplayLink( NODE *head ){
NODE *current;//当前指针
current = head;//将当前指针指向头结点
while( current!= NULL ){
printf("data = %d\n", current->data);
current = current->next;//指针后移
}
}

/**根据位置查找**/
void FindItemByPosition( NODE *head, int position ){
int len = GetLinkLen( head );//查看链表长度
if( len < position+1 ) {
printf("position error link len is %d\n", len);
return;
}
NODE *current;//当前指针
current = head;//将当前指针指向头结点
//int size = sizeof(NODE);//计算结构体大小
//current = head+position*size;//指针指向所查位置
for( int i =0 ; i< position ; i++ ){
current = current->next;
}
printf("position %d data is %d\n", position,current->data);
}

/**根据内容查找**/
void FindItem( NODE *head ,int value ){
NODE *current;//当前指针
current = head;//将当前指针指向头结点
int position = 0;
while( current ){
if( current->data == value ){
printf("The %d position is %d\n", value,position);
return ;
}
position++;
current = current->next;//指针后移
}
printf("Don't find %d position\n", value);
return;
}

/**插入节点**/
NODE *InsertItem( NODE *head, int position, int value ){
int len = GetLinkLen( head );//链表长度
NODE *insert;//需要插入的
insert = (NODE *)malloc( sizeof (NODE) );//内存分配
insert->data = value;
//1.查找要插入的位置
//插入头
if( position == 0 ){
insert->next = head;
return insert;
}
//插入尾部
if( len < position + 1 ){
position = len;
}
NODE *current,*prev;//当前指针,前驱指针
current = head;//当前指针指向头结点
for( int i=0; i<position; i++ ){
prev = current;//前驱指针定位
current = current->next;//指针后移
}
prev->next = insert;
insert->next = current;
return head;
}

/**删除节点**/
NODE *DelItem( NODE *head, int value ){
NODE *current,*prev;//当前指针,前驱指针
current = head;
int position = 0;
while (current){
if( current->data == value ){
if( position == 0 ){//头结点被删除
NODE *newhead = head->next;
free( head );
return newhead;
}
prev->next = current->next;//将前驱指针定位到删除节点的下一个节点
free( current );
return head;
}else{
prev = current;//定位前驱指针
current = current->next; //指针后移
}

}
printf("%d not exist in link\n", value);
return head;
}

/**根据位置删除节点**/
NODE *DelItemByPosition( NODE *head, int position ){
NODE *current,*prev;//当前指针,前驱指针
current = head;
if( position == 0 ){//删除头节点
NODE *newhead = head->next;
free( head );
return newhead;
}
int len = GetLinkLen( head );//获取列表长度
if( len < position + 1 ){
position = len;
}
for( int i = 0 ; i < position ; i++ ){
prev = current;//定位前驱指针
current = current->next;//指针后移
}
prev->next = current->next;
free( current );
return head;
}

/**删除整个链表**/
void DelLink( NODE *head ){
NODE *current,*prev;//当前指针,前驱指针
current = head;
while( current != NULL ){
prev = current;//将当前指针指向头结点
current = current->next;//指针后移
free( prev );//删除前驱节点
}
printf("Del Link Done\n");
}
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
蟲蟲O_O
C语言 70,039 成员 243,237 内容