亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

單鏈表的增刪查 逆置 倒數第k個節點等問題

發布時間:2020-07-20 04:47:25 來源:網絡 閱讀:351 作者:菜鳥筆記 欄目:編程語言
    對于單鏈表而言,它沒有雙鏈表那么復雜,它只有頭節點,尾節點,節點數據,后繼指針。在下面本人實現了 單鏈表的 增   刪   插  查  改。
    
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Datatype;
typedef struct SListNode
{
	Datatype data;
	struct SListNode*next;
}SListNode;
void PushBack(SListNode*&pHead, Datatype x);
void PopBack(SListNode *&pHead);
void PrintSlist(SListNode *&PHead);
void PushFrot(SListNode*&pHead,Datatype x);
void PopFront(SListNode*&pHead);
SListNode *Find(SListNode*pHead, Datatype x);
//void Insert(SListNode*pHead, Datatype pos, Datatype x);
void Insert(SListNode*pHead,  Datatype x);
void Erase(SListNode*&pHead,SListNode *pos );
void InsertNoNode(SListNode *pos, Datatype x);


SListNode* _BuyNode(Datatype x)
{
	SListNode *temp = (SListNode*)malloc(sizeof(SListNode));
	temp->data = x;
	temp->next = NULL;
	return temp;
}
void PushBack(SListNode*&pHead, Datatype x)
{
	//1 空   2  不為空
	if (pHead == NULL)
	{
		pHead = _BuyNode(x);
	}
	else
	{
		SListNode *tail = pHead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = _BuyNode(x);
	}
}
void PopBack(SListNode *&pHead)
{
	//1空  2 一個節點  3 多個節點  
	if(pHead == NULL)
	{
		return;
	}
	else if (pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else{
		SListNode *tail = pHead;
		SListNode *tem = NULL;
		while (tail->next != NULL)
		{
			tem = tail;
			tail = tail->next;
		}
		free(tail);
		tem->next = NULL; 
	}
}
void PrintSlist(SListNode *&PHead)  //打印鏈表
{
	SListNode*cur = PHead;
	while (cur!=NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
void PushFrot(SListNode*&pHead, Datatype x)   //頭插
{
	if (pHead == NULL)
	{
		pHead = _BuyNode(x);
	}
	else
	{
		SListNode *tmp = _BuyNode(x);
		tmp->next = pHead;
		pHead = tmp;
	}
}
void PopFront(SListNode*&pHead)    //單鏈表頭刪
{
	//1 空
	//2 一個結點
	//3 一個以上的節點
	if (pHead == NULL)
	{
		return;
	}
	else if(pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else
	{
		SListNode *tmp = pHead;
		pHead = pHead->next;
		free(tmp);
	}
	
}

SListNode *Find(SListNode*pHead, Datatype x)    //查找節點
{
	//assert(pHead);
	SListNode *tail = NULL;//當前指針
	Datatype tmp ;   //保存節點數據
    if (pHead->data == x)
	{
		return pHead;
	}
	else
	{
		tail=pHead->next;
		while (tail!= NULL)
		{
			tmp = tail->data;
			if (tmp == x)  //把節點數據與要查找的數比較
			{
				return tail; //返回所要查找結點的地址
			}
			else
			{
				tail =tail->next;
			}
		}	
		printf("沒有查到該數據!\n");
	}
}

void Insert(SListNode*pos, Datatype x)  ////在指定節點  插入數據
{
	assert(pos);
	SListNode *tmp = _BuyNode(x);
	tmp->next = pos->next;
	pos->next = tmp;
}

	

void Erase(SListNode *&pHead,SListNode *pos) //刪除指定位置的節點
{
	assert(pos);
	assert(pHead);
	if (pHead == pos)
	{
		pHead = pHead->next;
		free(pos);
		return;
	}
	SListNode *prv = pHead;
	while (prv)
	{
		if (prv->next == pos)
		{
			prv->next = pos->next;
			free(pos);
			break;
		}
		prv = prv->next;
	}
	
	
}

//刪除一個無頭單鏈表
void DelNoNode(SListNode *pos)
{
	assert(pos);
	assert(pos->next);
	SListNode *del = pos->next;
	SListNode *next = del->next;
	pos->data = del->data;
	pos->next = next;
	free(del);
}
//在無頭單鏈表的一個非頭節點前插入一個節點
void InsertNoNode(SListNode *pos, Datatype x)
{
	assert(pos);
	//assert(pos->next);
//1 種方法	//Datatype temp = 0;
	//SListNode *behind = pos;
	//SListNode*prv =_BuyNode(x);
	//SListNode *next = behind->next;
	//pos->next = prv;
	//prv->next = next;
	//temp = pos->data;
	//pos->data = prv->data;
	//prv->data = temp;
//2 種方法
	SListNode*prv = _BuyNode(pos->data);
	prv->next = pos->next;
	pos->next = prv;
	pos->data = x;
}
//查找中間節點
SListNode *FindmidNode(SListNode *phead)
{
	SListNode *fast = phead;
	SListNode *slow = phead;
	while (fast&&fast->next)
	{
		fast = fast->next->next;
        slow = slow->next;	
	}
	return slow;
}

    //找倒數第k個節點
SListNode *FindkNode(SListNode *phead, int k)
{
	SListNode *fast = phead;
	SListNode *slow = phead;
    /*for (int i = 1; i<=k-1; i++)
		{
		 	fast = fast->next;
		}
	while (fast->next)
	{
		
		slow = slow->next;
		fast = fast->next;
	}*/
	while (fast&&k--)
	{
		
		fast= fast->next;
		if (fast == NULL)
			return NULL;
	}
	while (fast)
	{
		slow = slow->next;
		fast = fast->next;
	}
	return slow;
}
//從尾到頭打印鏈表
void PrintTailToHead(SListNode*phead)
{
	if (phead)
	{
		PrintTailToHead(phead->next);
		printf("%d ", phead->data);
	}
}
//
SListNode *Reverse(SListNode *phead)//單鏈表的逆置
{
	SListNode *cur = phead;
	SListNode *newhead = NULL;
	while (cur)
	{
		SListNode*tmp =cur;
		cur = cur->next;
		tmp->next =newhead;
		newhead = tmp;
	}
	return newhead;
}
void test1()
{
	SListNode*list = NULL;
	PushBack(list, 1);
	PushBack(list, 3);
	PushBack(list, 2);
	PushBack(list, 4);
	PushBack(list, 6);
	PrintSlist(list);
}
void test2()
{
	SListNode*list = NULL;
	PushBack(list, 1);
	PushBack(list, 2);
	PushBack(list, 3);
	PushBack(list, 4);
	PushBack(list, 5);
	PushBack(list, 6);
	PushBack(list, 7);
	PrintSlist(list);
	//Find(list, 4);
	//Insert(list,7, 8);
	SListNode *pos = Find(list, 1);
	Erase(list,pos );
	PrintSlist(list);
}
void test3()
{
	SListNode*list = NULL;
	PushBack(list, 1);
	PushBack(list, 2);
	PushBack(list, 3);
	PushBack(list, 4);
	PushBack(list, 5);
	PushBack(list, 6);
	PushBack(list, 7);
	PrintSlist(list);
	SListNode *pos = Find(list ,7);
	Insert(pos, 2);
	PrintSlist(list);
}
void test4()
{
	SListNode*list = NULL;
	PushBack(list, 1);
	PushBack(list, 2);
	PushBack(list, 3);
	PushBack(list, 4);
	PushBack(list, 5);
	PushBack(list, 6);
	PushBack(list, 7);
	PrintSlist(list);
	/*SListNode *pos = list;
	DelNoNode(pos);*/
	SListNode *pos = Find(list,1);
	InsertNoNode(pos, 9);
	PrintSlist(list);
}
void test5()
{
	SListNode *list = NULL;
	PushBack(list, 1);
	PushBack(list, 8);
	PushBack(list, 2);
	PushBack(list, 3);
	PushBack(list, 4);
	PushBack(list, 5);
	PrintSlist(list);
	//SListNode*pos = FindmidNode(list);
	SListNode*pos =FindkNode(list, 5);
	printf("%d\n", pos->data);
	//PrintSlist(list);
}
void test6()
{
	SListNode*list = NULL;
	PushBack(list, 1);
	PushBack(list, 3);
	PushBack(list, 2);
	PushBack(list, 4);
	PushBack(list, 6);
	// 
	SListNode*pos=Reverse(list);
	PrintTailToHead(pos);
}
int main()
{
	//test1();
	test6();
	system("pause");
	return 0;
}

   以上如果發現有錯的地方或者還有其他建議,希望提出寶貴意見。謝謝!!!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮滨县| 土默特右旗| 乌兰察布市| 甘肃省| 霸州市| 扶风县| 伊川县| 咸丰县| 通江县| 睢宁县| 萨嘎县| 怀来县| 洛宁县| 宁强县| 托里县| 福安市| 成都市| 曲水县| 岗巴县| 高清| 巨鹿县| 宜城市| 邛崃市| 迁西县| 安庆市| 阿拉善左旗| 五河县| 内丘县| 健康| 陇西县| 克东县| 遂平县| 台东县| 西充县| 韩城市| 望都县| 合川市| 芷江| 崇阳县| 调兵山市| 苏尼特右旗|