單鏈表代碼使用和總結

本文前提:複習鏈表結構
由於我會直接貼出代碼,供大家共同學習,不再贅述鏈表結構的基礎知識。
本文參考博文:
https://blog.csdn.net/Endeavor_G/article/details/80552680#commentsedit
https://blog.csdn.net/calculate23/article/details/79758845

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//創建鏈表
typedef struct student
{
int score;
struct student* next;
}LinkList;

//初始化並創建一個n節點的鏈表
LinkList* creat(int n)
{
LinkList* head;
LinkList* node;
LinkList* end;
head = (LinkList*)malloc(sizeof(LinkList));
end = head;
int i;
for (i=0;i<n;i++)
{
node = (LinkList*)malloc(sizeof(LinkList));
scanf_s("%d",&node->score,sizeof(node->score));
end->next = node;//一次循環從表尾加入一個節點node(i),此時的end應該是新加入的end了,
//所以上次的end->next需要指向新加入的node
end = node;//新加入的node爲新的end
}
end->next = NULL;//鏈表尾端指向NULL
return head;
}

void find(LinkList* list,int x) //尋找
{
LinkList* p = list;
int count = 1;
while (p->next != NULL)
{
if (p->score == x)
{
printf(“鏈表第%d位數據%d找到!\n”,count,p->score);

}
p = p->next;
count++;

}
puts(“輸入的數據沒有找到”);
}

LinkList* change(LinkList* list, int n ) //修改第n+1個節點的值
{
LinkList* t = list;
int i = 0;
while (i < n && t != NULL) //同時滿足鏈表不是空的且在修改的表之前。
{
t = t->next;
i++;
}
if (i == n)
{
puts(“請輸入要修改的值”);
scanf_s("%d",&t->score,sizeof(t->score));
}
else
{
printf(“節點%d不存在”,n+1);
}
return list;
}
//刪除鏈表時注意:
//一、判斷待刪除的節點是否爲頭結點;
//
//二、注意傳入的位置值(n)是否有效;
//
//三、注意鏈表節點只有一個時的情況。
LinkList* delet(LinkList* list, int n) //此處爲代碼方法1;
{
LinkList* pdel = NULL;
LinkList* pnew = NULL;
LinkList* temp = list;
int i = 0;
if (list == NULL)
{
printf(“鏈表爲空!\n”);
return list;
}
if (n == 1)
{
pnew = temp->next;
free(temp);

	if (pnew == NULL)
	{
		return NULL;//節點數爲1的刪除了就變成了空鏈表了。
	}
	else
	{
		return pnew;
	}
}
i++;
while (temp)
{
	if (i == n)
	{
		pdel = temp->next;
		temp->next = temp->next->next;
		free(pdel);
		return list;
	}
	else
	{
		temp = temp->next;
		i++;
	}
}
printf("位置%d處無節點!\n", n);
return list;

}

LinkList* delet1(LinkList* list, int n) //第二種方法
{
LinkList* t = list,in;
in = (LinkList
)malloc(sizeof(LinkList)); //此處無比初始化
int i = 0;
while (i < n && t != NULL)
{
in = t;
t = t->next; //巧妙在每一次td都是指向了下一個節點
i++;
}
if (t != NULL)
{
in->next = t->next; //此時in->next指向了t->next
free(t);
return in;
}
else
{
puts(“節點不存在”);
return NULL;
}
return list;
}

void print(LinkList* list)
{
LinkList* p = list;
while (p->next!=NULL)
{
p = p->next;
printf("%d\n",p->score);

}

}
void insert(LinkList* list, int n) //插入節點
{
LinkList* t = list, * in;
int i = 0;
while (i < n && t != NULL)
{
t = t->next;
i++;
}
if (t != NULL)
{
in = (LinkList*)malloc(sizeof(LinkList));
puts(“輸入要插入的值:”);
scanf_s("%d",&in->score,sizeof(in->score));
in->next = t->next;
t->next = in;
}
else
{

	puts("要查找的節點不存在");
}

}

int main()
{
LinkList* hu=NULL;

hu = (LinkList*)malloc(sizeof(LinkList));
hu=creat(5);
print(hu);
find(hu,3);
printf("在節點4後插入數據\n");
insert(hu,4);
print(hu);
printf("在節點1處刪除數據\n");
hu=delet1(hu,1);
print(hu);
printf("在節點3處刪除數據\n");
hu=change(hu,3);
print(hu);

return 0;

}

運行環境VS2019,有不對的地方可以提出來討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章