单链表的增删

/*2015-1-13  [watchmen 数据结构和算法] 链表和数组
**   链表操作,头部,尾部和中间节点的插入   中间没写
**   删除其中的一个节点数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct list{//创建单链表的结构体
	int data;
	struct list *next;
}listnode, *linklist;
linklist head_insert(linklist head, linklist newnode)
{//从head插入节点
	assert(newnode);//检查new是否为null
	
	newnode->next = head;
	head = newnode;
	
	return head;
}
linklist tail_insert(linklist head, linklist newnode)
{//从tail插入    1.首先要找到tail
	assert(newnode);
	if(head == NULL)
	{//如果为空链表,新的节点即为头指针
		head = newnode;
	}
	else
	{
		linklist temp = head;
		while(temp->next != NULL)
			temp = temp->next;      //当temp->next 为NULL 时,temp为最后的节点
			
		newnode->next = NULL;	    //新节点指向空  
	    temp->next = newnode;       //最后节点指向新的节点
	}
	
	return head;
}
linklist delnode(linklist head, int data)
{
	linklist temp = head;
	if(temp == NULL)
		return NULL;
	if(temp->data == data)
	{//删除第一个节点
		head = head->next;
		free(temp);
		return head;
	}
	
	linklist prev = head;
	temp = head->next;
	
	while(temp != NULL && temp->data != data)
	{
		prev = temp;
		temp = temp->next;
	}
	
	if(temp == NULL)
		return NULL;
	prev->next = temp->next;
	free(temp);
	return head;
}
void output(linklist head)
{//链表输出
	linklist temp = head;  //----曾编程错误-_-||------linklist temp------------
	while(temp)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
	
}
int main(int argc,char *argv[])
{
	linklist head = NULL;
	srand(time(NULL));
	int i;
	for(i=0;i<10;i++)
	{
		linklist newnode = (linklist)malloc(sizeof(listnode));
		newnode->data = rand()%100;
		newnode->next = NULL;
	//	head = head_insert(head,newnode);
		head = tail_insert(head,newnode);
		output(head);
	//	getchar();
	}
	
	/******删除操作*****/
	printf("pls input the delete data>>>");
	int number = 0;
	scanf("%d",&number);
	
	linklist temp = delnode(head, number);
	if(NULL == temp)
	{
		printf("del failure or not has this node\n");
	}
	else
	{
		head = temp;
		output(head);		
	}
	return 0;
}


操作链表 ,应该首先操作新的节点后操作相应的指针指向

增加:(1) 在头部增加    newnode->head;  head = newnode;

          (2)在尾部增加    newnode->NULL;  tail  =  newnode;     首先要找到tail   ,  分空和不为空

删除:(1)查找数据节点   链表为空, 删除的第一个节点数据; 中间数据



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值