#include <stdio.h>
#include <stdlib.h>
typedef struct Link
{
int data;
struct Link* next;
}link;
//創建鏈表
link* InitLink()
{
link* p = (link*)malloc(sizeof(link));
link* temp = p;
for (int i = 1; i < 6; ++i)
{
link* a = (link*)malloc(sizeof(link));
a->data = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
//插入元素
//num爲插入元素,add爲插入位置
link* InsertData(link* p,int num,int add)
{
link* temp = p;
//找到要插入的位置
for (int i = 1; i < add; ++i)
{
temp = temp->next;
if (temp == NULL)
{
printf("插入位置無效");
return p;
}
}
//創建插入節點C
link* c = (link*)malloc(sizeof(link));
c->data = num;
//先鏈接後面,在連接前面
c->next = temp->next;
temp->next = c;
return p;
}
//刪除元素,將節點從鏈表中取下,再釋放存儲空間
link* DelData(link* p,int num)
{
link* temp = p;
for (int i = 1; i < num; ++i)
{
temp = temp->next;
if (temp->next == NULL)
{
printf("沒有該節點");
return p;
}
}
link* del = temp->next; //單獨設置一個指針指向被刪除節點,防止丟失
temp->next = temp->next->next;
free(del);
return p;
}
//查找元素,遍歷法
int findData(link* p,int num)
{
link *t = p;
int i = 1;
while (t->next)
{
t = t->next;
if (t->data==num)
{
return i;
}
i++;
}
return -1;
}
//更新元素
link* ChangeData(link* p,int add,int newdata)
{
link* temp = p;
temp = temp->next; //讓temp指向首元節點
//遍歷更新節點
for (int i = 1; i < add; ++i)
{
temp = temp->next;
}
temp->data = newdata;
return p;
}
//打印
void Print(link* p)
{
link* temp = p;
while (temp->next)
{
temp = temp->next;
printf("%d ",temp->data);
}
printf("\n");
}
int main()
{
link* p = InitLink();
Print(p);
//第4個位置插入5
p = InsertData(p,5,4);
Print(p);
//刪除元素3
p= DelData(p,3);
Print(p);
//查找元素2的位置
int add = findData(p,2);
if (add == -1)
printf("沒有該元素");
else
printf("元素2的位置爲:%d \n",add);
//更改第3個位置上的數據爲7
p = ChangeData(p,3,7);
Print(p);
system("pause");
return 0;
}