zoukankan      html  css  js  c++  java
  • 单链表的基本操作

    单链表的操作有两种,一种是带头节点的链表,一种是不带头节点的链表:

      首先我们看一下不带头节点的链表的基本操作:

    /****************************************
    本程序所写的链表均是不带头节点的链表操作
    ****************************************/
    
    #include "stdio.h"
    #include "stdlib.h"
    
    typedef struct _Node
    {
    	int data;
    	struct _Node* next;
    }Node;
    
    Node* InitNode(int val)
    {
    	Node* NodeFirst = (Node *)malloc(sizeof(Node));
    	NodeFirst->data = val;
    	NodeFirst->next = NULL;
    	
    	return NodeFirst;
    }
    
    int SqlistDisplay(Node* head)
    {
    	Node* TmpNode = head;
    
    	if (head == NULL)
    	{
    		return 1;
    	}
    
    	while (1)
    	{
    		printf("%d", TmpNode->data);
    		if (TmpNode->next == NULL)
    		{
    			break;
    		}
    		else
    		{
    			TmpNode = TmpNode->next;
    			printf("->");
    		}
    	}
    	printf("
    ");
    	return 0;
    }
    
    /**************************
    头插法,对链表追加一个结点
    ***************************/
    
    Node* SqlistHeadInsert(Node* head, int val)
    {
    	Node* NodeInsert = NULL;
    
    	if (head == NULL)
    	{
    		return head;
    	}
    
    	NodeInsert = (Node*)malloc(sizeof(Node));
    
    	NodeInsert->data = val;
    	NodeInsert->next = head;
    
    	return NodeInsert;
    }
    
    /*****************************
    头插法,对链表末尾追加一个结点
    *****************************/
    
    Node* SqlistTailInsert(Node* head, int val)
    {
    	Node* NodeInsert = NULL;
    	Node* TmpNode = head;
    
    	if (head == NULL)
    	{
    		return head;
    	}
    
    	NodeInsert = (Node*)malloc(sizeof(Node));
    
    	NodeInsert->data = val;
    	NodeInsert->next = NULL;
    	while (TmpNode->next != NULL)
    	{
    		TmpNode = TmpNode->next;
    	}
    
    	TmpNode->next = NodeInsert;
    
    	return head;
    }
    
    /*****************************
    添加操作,在指定位置添加结点
    *****************************/
    
    Node* NodeInsert(Node* head, int location, int val)
    {
    	Node* TmpNode = NULL;
    	Node* InsertNode = NULL;
    
    	if (head == NULL || location == 0)
    	{
    		InsertNode = (Node*)malloc(sizeof(Node));
    		InsertNode->data = val;
    		InsertNode->next = head;
    		return InsertNode;
    	}
    	else
    	{
    		TmpNode = head;
    		while(--location)
    		{
    			TmpNode = TmpNode->next;
    			if (TmpNode == NULL)
    			{
    				printf("index has over flow!
    ");
    				return head;
    			}
    		}
    
    		InsertNode = (Node*)malloc(sizeof(Node));
    		InsertNode->data = val;
    		InsertNode->next = TmpNode->next;
    		TmpNode->next = InsertNode;
    		return head;
    	}
    }
    
    /*****************************
    删除操作,删除指定位置的结点
    *****************************/
    
    Node* NodeDelete(Node* head, int location)
    {
    	Node* FinalNode = head;
    	Node* TmpNode = head;
    	Node* freeNode = NULL;
    
    	if (head == NULL)
    	{
    		return head;
    	}
    
    	if (location == 0)
    	{
    		FinalNode = head->next;
    		free(TmpNode);
    	}
    	else
    	{
    		while (--location)
    		{
    			TmpNode = TmpNode->next;
    			if (TmpNode->next == NULL)
    			{
    				printf("index node does not exist!
    ");
    				return NULL;
    			}
    		}
    
    		freeNode = TmpNode->next;
    		TmpNode->next = freeNode->next;
    		free(freeNode);
    	}
    
    	return FinalNode;
    }
    
    /*****************************
    链表的逆序操作,将链表的顺序逆转
    *****************************/
    
    Node* ListReserse(Node* head)
    {
    	if (head == NULL || head->next == NULL)
    	{
    		return head;
    	}
    
    	Node* pre = NULL;
    	Node* cur = NULL;
    	Node* nex = NULL;
    
    	pre = head;
    	cur = pre->next;
    
    	while (cur)
    	{
    		nex = cur->next;
    		cur->next = pre;
    		pre = cur;
    		cur = nex;
    	}
    
    	head->next = NULL;
    	head = pre;
    
    	return head;
    }
    
    /*****************************
    链表的合并操作
    *****************************/
    
    Node* ListMerge(Node* L1, Node* L2)
    {
    	Node* L = NULL;
    	Node* r = NULL;
    	Node* p1 = L1;
    	Node* p2 = L2;
    
    	if (p1->data < p2->data)
    	{
    		L = p1;
    		p1 = p1->next;
    	}
    	else
    	{
    		L = p2;
    		p2 = p2->next;
    	}
    
    	r = L;
    	while (p1&&p2)
    	{
    		if (p1->data < p2->data)
    		{
    			r->next = p1;
    			r = p1;
    			p1 = p1->next;
    		}
    		else
    		{
    			r->next = p2;
    			r = p2;
    			p2 = p2->next;
    		}
    	}
    
    	if (p1)
    	{
    		r->next = p1;
    	}
    	else
    	{
    		r->next = p2;
    	}
    
    	return L;
    }
    
    int main()
    {
    	Node* Sqlist = InitNode(1);
    	Node* Sqlist1 = InitNode(999);
    	Node* SqlistMerged = NULL;
    
    	Sqlist = SqlistTailInsert(Sqlist, 2);
    	Sqlist = SqlistTailInsert(Sqlist, 3);
    	Sqlist = SqlistTailInsert(Sqlist, 4);
    	Sqlist = SqlistTailInsert(Sqlist, 5);
    
    	Sqlist1 = SqlistTailInsert(Sqlist1, 875);
    	Sqlist1 = SqlistTailInsert(Sqlist1, 325);
    	Sqlist1 = SqlistTailInsert(Sqlist1, 478);
    	Sqlist1 = SqlistTailInsert(Sqlist1, 533);
    
    	SqlistDisplay(Sqlist);
    
    	Sqlist = ListReserse(Sqlist);
    
    	SqlistDisplay(Sqlist);
    
    	Sqlist = NodeInsert(Sqlist, 2, 123);
    
    	SqlistDisplay(Sqlist);
    
    	Sqlist = NodeDelete(Sqlist, 4);
    
    	SqlistDisplay(Sqlist);
    
    	SqlistMerged = ListMerge(Sqlist, Sqlist1);
    	SqlistDisplay(SqlistMerged);
    
    	getchar();
    }
    

      

  • 相关阅读:
    黑马程序员JAVA高级视频_IO输入与输出18天2(FileWriter)
    黑马程序员JavaAPI17天5(集合转成数组)
    黑马程序员JAVA高级视频_IO输入与输出19天4(MyBufferedReader)
    android 取消webview的背景色
    DLNA
    Android JNI的若干问题总结
    gcc 一些应用
    如何基于nand flash启动Linux内核(分享一段实用、简单、类似bootloader功能的代码)
    Android JNI开发高级篇有关Android JNI开发中比较强大和有用的功能就是从JNI层创建、构造Java的类或执行Java层的方法获取属性等操作。 一、类的相关操作 1. jclass FindClass(JNIEnv *env, const char *name);
    ubuntu 配置ndk
  • 原文地址:https://www.cnblogs.com/xuyong437/p/11356649.html
Copyright © 2011-2022 走看看