链表的基本操作

# include <stdio.h>
# include <malloc.h>

struct list
{
	int num;
	struct list * next;
};

typedef struct list node;
typedef node * link;

void printlist(link head);                          //输出 链表 
link creatlist(int array[],int len);				//创建链表 
link insertlist(link ahead,link bhead); 			//合并链表 
int lenghlist(link head);							//测量长度 
link sortlist(link head,int len);					// 排序链表 
link deletelist(link head,link ptr);				//删除节点 
link findlist(link head,int num);					//遍历链表 
link insertnode(link head,link ptr);				//插入节点 
void freelist(link head);							//释放链表 

int main (void)
{
	int len,num;
	link ahead,bhead,head,ptr; 
	int a[5]={1,2,3,4,5};
	int b[5]={10,9,8,7,6};
	printf ("输出链表a:\n");
	ahead = creatlist(a,5);           				//创建链表 a 
	printlist(ahead);								//输出链表a 
	printf ("输出链表b:\n");
	bhead = creatlist(b,5);							//创建链表b 
	printlist(bhead);								//输出链表b 
	
	printf ("a表的长度为%d \n",lenghlist(ahead));	
	printf ("b表的长度为%d \n",lenghlist(bhead));
	
	head = insertlist(ahead,bhead);					//合并a,b链表 
	printlist(head);
	
	printf ("排序:\n");
	len = lenghlist(head);
	head = sortlist(head,len);						//对总链表进行排序 
	printlist(head);
	
	printf ("请输入要删除的数字:\n");
	scanf ("%d",&num);
	ptr = findlist(head,num); 						//查找要删除节点的位置 
	head = deletelist(head,ptr);					//删除节点 
	printlist(head);
	
	printf ("请输入在哪个数字后插入n:\n");
	scanf ("%d",&num);
	ptr = findlist(head,num);						//查找要插入节点的位置 
	head = insertnode(head,ptr); 					//插入节点 
	printlist(head);

	freelist(head);									//释放链表 
	
	return 0;
}

void printlist(link head)
{
	link ptr;
	ptr = head;
	ptr = ptr->next;
	while(ptr != NULL)								//遍历 
	{
		printf ("%d ",ptr->num);
		ptr = ptr->next;
	}
	printf ("\n");
}

link creatlist(int array[],int len)
{
	int i;
	link head,ptr,ptr1;
	head = (link)malloc(sizeof(node));				//创建头指针 
	if (!head)
	return NULL;
	ptr = head;
	for (i=0;i<len;++i)
	{
		ptr1 = (link)malloc(sizeof(node));
		if (!ptr1)
		return NULL;
		ptr1->num = array[i];
		ptr1->next = NULL;
		ptr->next = ptr1;							//连接结点 
		ptr = ptr->next;
	}
	
	return head;
}

link insertlist(link ahead,link bhead)
{
	link ptr1,ptr2,head;
	
	ptr1 = ahead->next;
	ptr2 = bhead->next;
	head = ahead;
	
	if (ptr1 == NULL && ptr2 == NULL)
	return NULL;
	else if (ptr1 == NULL)
	return ptr2;
	else if (ptr2 == NULL)
	return ptr1;
	
	while(ptr1->next != NULL)
	ptr1 = ptr1->next;
	
	ptr1->next = ptr2;
	
	return head;
}

int lenghlist(link head)
{
	int len=0;
	link ptr;
	ptr = head->next;
	while(ptr != NULL)							//遍历链表 
	{
		ptr = ptr->next;
		++len;
	}
	
	return len;
}

link sortlist(link head,int len)
{
	int i,j,t;
	link ptr1,ptr2;
	ptr1 = head->next;
	for (i=0;i<len-1;ptr1 = ptr1->next,++i)    //任意排序即可 
	{
		for (j=i+1,ptr2 = ptr1->next;j<len;ptr2 = ptr2->next,++j)
		{
			if (ptr1->num > ptr2->num)
			{
				t = ptr1->num;
				ptr1->num = ptr2->num;
				ptr2->num = t;
			}
		}
	}
	
	return head;
}

link deletelist(link head,link ptr)
{
	link previous;										//创建临时结点 
	if (!head)
	return NULL;
	previous = head->next;
	while(previous != NULL)
	{
		if (previous->next == ptr)
		previous->next = ptr->next;						//删除结点 
		previous = previous->next;
	}
	
	return head;
}

link findlist(link head,int num)
{
	link ptr;
	ptr = head->next;							//指针下移 
	while(ptr->num != num)
	ptr = ptr->next;
	
	return ptr;
}

link insertnode(link head,link ptr)
{
	int num;
	link ptr1;
	link newnode;
	newnode = (link)malloc(sizeof(node));		//为创建的新结点分配空间 
	if (!newnode)
	return NULL;
	scanf ("%d",&num);
	newnode->num = num;
	newnode->next = NULL;						//为新节点的指针域赋零 
	ptr1 = head->next;
	if(ptr1 == NULL)
	{
		newnode->next = head;
		return newnode;
	}
	else
	{
		if (ptr1->next == NULL)					
		ptr1->next = newnode;					 
		else 
		{
			newnode->next = ptr->next;			// 插入结点 
			ptr->next = newnode;				//连接结点 
		}
	}
		
	
	return head;
}

void freelist(link head)
{
	link ptr;
	
	ptr = head;
	head = head->next;									// 指针移动 
	free(ptr);											//释放结点 
	
	while(head != NULL)
	{
		ptr = head;
		head = head->next;
		free(ptr);										//释放结点 
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C语言链表基本操作的代码示例: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node *next; }; struct Node* create_node(int data) { struct Node* new_node = (struct Node*) malloc(sizeof(struct Node)); new_node->data = data; new_node->next = NULL; return new_node; } void add_node(struct Node** head, int data) { struct Node* new_node = create_node(data); if (*head == NULL) { *head = new_node; return; } struct Node* current_node = *head; while (current_node->next != NULL) { current_node = current_node->next; } current_node->next = new_node; } void delete_node(struct Node** head, int data) { struct Node* current_node = *head; struct Node* prev_node = NULL; while (current_node != NULL && current_node->data != data) { prev_node = current_node; current_node = current_node->next; } if (current_node == NULL) { return; } if (prev_node == NULL) { *head = current_node->next; } else { prev_node->next = current_node->next; } free(current_node); } void print_list(struct Node* head) { struct Node* current_node = head; while (current_node != NULL) { printf("%d ", current_node->data); current_node = current_node->next; } printf("\n"); } int main() { struct Node* head = NULL; add_node(&head, 5); add_node(&head, 10); add_node(&head, 15); add_node(&head, 20); print_list(head); delete_node(&head, 15); print_list(head); delete_node(&head, 5); print_list(head); return 0; } ``` 以上是一个简单的链表实现,包括了节点创建、添加、删除以及遍历链表并打印数据的操作。请注意,这只是一个示例代码,实际应用时需要根据具体问题进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值