利用链表的头节点来操作链表
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int data_t;
typedef struct node
{
data_t data;
struct node *next;
}linklist;
//初始化
linklist *creatLinKlist(void)
{
linklist *head=(linklist *)malloc(sizeof(linklist));
if(head==NULL)
{
perror("malloc");
return NULL;
}
head->next=NULL;
head->data=-1;
return head;
}
//判空
int linklist_is_empty(linklist *head)
{
return (head->next==NULL)?1:0;
}
//求表长
int linklist_length(linklist *head)
{
int len=0;
linklist *p=head->next;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
//按位置添加节点
int linklist_add(linklist *head,int pos,data_t data)
{
int len=linklist_length(head);
if(pos<0 || pos>len)
{
printf("pos输入不合法\n");
return -1;
}
//准备新节点
linklist *new=(linklist *)malloc(sizeof(linklist));
new->data=data;
new->next=NULL;
//插入前,找到pos节点的前一个节点
linklist *p=head;
while(pos--)
{
p=p->next;
}
//先连后断
new->next=p->next;
p->next=new;
return 0;
}
//按位置节点删除
int linklist_shanchu(linklist *head,int pos)
{
if(linklist_is_empty(head))
{
printf("biao is null\n");
return -1;
}
int len=linklist_length(head);
if(pos<0 || pos>=len)
{
printf("pos不合法\n");
return -1;
}
//找到pos前一个节点
linklist *p=head;
while(pos--)
{
p=p->next;
}
linklist *q=p->next;
p->next=q->next;
free(q);
q=NULL;
return 0;
}
//按位置查找节点
data_t linklist_weicha(linklist *head,int pos)
{
if(linklist_is_empty(head))
{
printf("biao is null\n");
return -1;
}
int len=linklist_length(head);
if(pos<0 || pos>len)
{
printf("pos不合法\n");
return -1;
}
linklist *p=head;
while(pos--)
{
p=p->next;
}
return p->data;
}
//按位置修改节点
int linklist_weixiu(linklist *head,int pos,data_t data)
{
if(linklist_is_empty(head))
{
printf("biao is null\n");
return -1;
}
int len=linklist_length(head);
if(pos<0)
{
printf("pos 不合法\n");
return -1;
}
linklist *p=head;
while(pos--)
{
p=p->next;
}
p->data=data;
return 0;
}
//按值查找节点
int linklist_zhicha(linklist *head,data_t data)
{
if(linklist_is_empty(head))
{
printf("biao is null\n");
return -1;
}
linklist *p=head;
int i=0;
while(p!=NULL)
{
if(p->data==data)
{
return i;
}
i++;
p=p->next;
}
printf("没有这个值\n");
return -1;
}
//按值删除节点
void linklist_zhishan(linklist *head,data_t data)
{
int a=linklist_zhicha(head,data);
linklist_shanchu(head,a);
// return 0;
}
//按值修改节点
int linklist_zhixiu(linklist *head,data_t old,data_t new)
{
int a=linklist_zhicha(head,old);
linklist_weixiu(head,a,new);
return 0;
}
//清空链表
int linklist_clear(linklist *head)
{
if(linklist_is_empty(head))
{
printf("biao is null\n");
return -1;
}
linklist *p=head->next;
linklist *q=NULL;
head->next=NULL;
while(p!=NULL)
{
q=p->next;
free(p);
p=NULL;
p=q;
}
return 0;
}
//销毁链表
void linklistdestory(linklist **head)
{
linklist_clear(*head);
free(*head);
*head=NULL;
}
//打印链表
void linklistdisplay(linklist *head)
{
linklist *p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
puts("");
}
//链表逆序
void linklistnixu(linklist *head)
{
linklist *p=head->next;
head->next=NULL;
linklist *q=NULL;
while(p!=NULL)
{
q=p->next;
p->next=head->next;
head->next=p;
p=q;
}
}
int main(int argc, char *argv[])
{
linklist *head=creatLinKlist();
if(head==NULL)
{
perror("creatsLinKlist");
return -1;
}
//赋值,插入
int i=0;
while(i<10)
{
linklist_add(head,i,i+1);
i++;
}
//打印
linklistdisplay(head);
//判断是否为空
int m;
m=linklist_is_empty(head);
printf("m=%d\n",m);
//求表长
int len=linklist_length(head);
printf("len=%d\n",len);
linklist_shanchu(head,6);
linklistdisplay(head);
//按位置查找
data_t a;
a=linklist_weicha(head,9);
printf("%d\n",a);
//按位置进行修改
linklist_weixiu(head,8,66);
linklistdisplay(head);
//按值进行删除
linklist_zhishan(head,66);
linklistdisplay(head);
//按值进行修改
linklist_zhixiu(head,8,99);
linklistdisplay(head);
//销毁
linklistnixu(head);
linklistdisplay(head);
linklistdestory(&head);
linklistdisplay(head);
return 0;
}
链表要想真正的学好,就是要不断的去敲,不断的改进!