c语言链表操作
一、 定义链表
这里以定义一个整型链表为例
typedef int Item //把int定义为Item
typedef struct node
{
Item item;
struct node *next;
}Node;
typedef Node *List;
二、 创建一个链表
List CreateList(void)
{
int list_length;//定义链表的长度
int val;//用来存放节点的值
List PHead=(List)malloc(sizeof(Node));//创建头节点
if(PHead==NULL)
fprintf(stderr,"There is no mem to use!");
List PTail=PHead;//链表开始尾结点就是头节点
PTail->next=NULL;
printf("Please input the List length");
scanf("%d",&list_length);
for(int i=0;i<len;i++) //循环输入每个节点的val
{
List PNew=(List)malloc(sizeof(Node));
if(PNew==NULL)
fprinf(stderr,"There is no mem to use");
printf("Please input %d Node value",i+1);
scanf("%d",&val);
PNew->item=val;
PNew->next=NULL;//把新节点的next赋为空
PTail->next=PNew;//把尾部节点的next指向新节点
PTail=PNew;//重置尾结点
}
return PHead;
}
三、在链表的任意位置插入新节点
void AddNodeInRand(int InsertPos,int InsertValue,List Plist)
{
int pos=0;
List AddNode=(List)malloc(sizeof(Node));//为插入节点分配内存
List list=plist;//把链表的头节点赋给list
while(list!=NULL&&pos<InsertPos-1)//找到被插入位置前一个节点
{
list=list->next;
++pos;
}
if(AddNode==NULL){
fprinf(stderr,"There is no mem to use");
}
AddNode->item=InsertValue;
AddNode->next=list->next;//被插入节点的next指向原先节点(InsertPos上的节点)
list->next=AddNode;//被插入位置前一个节点的next指向被插入的节点
}
三、在链表的任意位置删除节点
void DelNodeInRand(int DelPos,List plist){
List list=plist;
int pos;
while(pos<DelPos-1){
plist=plist->next;//找到被删除元素的前一个节点
++pos;
}
List Del=Plist->next;
if(Del->next==NULL){
plist->next=NULL;//被删除的元素为最后一个元素
}
else
{
plist->next=Del->next;//删除中间的元素
}
free(Del);
}
四、修改元素
void UpdateNode(int UpdateValue,int UpdatePos,List Plist){
int pos=0;
List list=Plist;
while(pos<UpdatePos){
list=list->next;//找到要修改的节点
++pos;
}
list->item=UpdateValue;//修改该节点的item
}
五、查找元素
bool FindNode(int findValue,List Plist)
{
List list=plist;
while(list!=NULL){ //循环遍历链表
list=list->next;
if(list->item==findValue) //通过比较节点的值找到该元素
return true;
else
return false;
}
}
六、遍历元素
void TraverseList(List Plist){
List list = Plist;
while(list!=NULL){//遍历链表
list=list->next;
printf("%d",list->item);
}
}