先定义一个结构体,并创建一个空的带头单链表!
typedef struct node
{
int data;
struct node * next;
}link_list;
link_list * creat_malloc() //返回一个指针
{
link_list *p ;
p = malloc(sizeof(*p));
if(p == NULL)
return NULL;
p->next = NULL;
return p;
}
顺序插入结点需要将你要插入的结点 与 链表中的值进行比较!
int list_order_insert(link_list *me,int *data) //顺序插入
{
link_list *p = me,*q;
while(p->next && p->next->data < *data ) //p->next 表示p->next不为空
{ //*data是你要插入的值
p = p->next; //你要插入的值大于当前结点,就与下一个结点比较
//当前结点的值要是大于*data,就跳出循环
}
q = malloc(sizeof(*q)); //为你插入的结点申请内存空间,并用q指向它
if(q == NULL) //如果申请失败,返回-1
return -1;
q->data = *data; //将参数*data 赋给q->data
q->next = p->next; //q这两句是插入的基本语句
p ->next = q;
return 0;
}
单链表的删除,按照传的参数进行删除:
int delete(link_list *me,int *value) //删除一个节点的函数
{
link_list *p = me; //p开始指向头结点
link_list *q =NULL;
while(p->next && p->next->data != *value )//判断p的下一个节点的值
p = p->next; //如果p的下一个结点不满足条件,p就往后移
if(p->next == NULL) //如果p的下一个结点为空,表示没有找到,返回-1
return -1;
else //如果找到了,就执行下面的语句
{
q = p->next; //找到以后,用q指向p的下一个结点
p->next = q->next; //p->next指向了q->next,跳过了q
free(q); //释放掉q
q = NULL; //将q赋为空
}
}
下面是主函数:
int main()
{
int i;
link_list *p;
int arr[] = {12,9,3,34,5,45,6};
p=creat_malloc();
printf("hello1\n");
for(i = 0;i<sizeof(arr)/sizeof(*arr);i++)
{
list_order_insert(p,&arr[i]);
}
printf("hello\n");
show(p);
int value = 9;
delete(p,&value);
show(p);
}
结果如下: