C单链表
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");
}
...全文
相关推荐
C语言单链表实现
c语言单链表的简单实现代码,有初学者的小伙伴可以参考一下。
C语言实现单链表反转
主要介绍了C语言实现单链表反转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
C语言之单链表的插入、删除与查找
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。要实现对单链表中节点的插入、删除与查找的功能,就要先进行的单链表的初始化、创建和遍历,进而实现各功能,以下是对单链表节点的插入、删除、查找功能的具体实现: #include #include #include typedef int ElemType; /** *链表通用类型 *ElemType 代表自定义的数据类型 *struct Node *next 代表 结构体指针(指向下一个结构体,完成链表动作) */ typedef struct Node{
C语言单链表创建打印
C语言单链表创建与打印的演示程序。VISUAL C++6.0环境编译成功。
单链表的C语言实现 完整C代码
单链表的C语言实现,按照严蔚敏数据结构(C语言版)给的ADT写的,可能不太全。


