链表的八大操作,只额外列出创建操作,其他操作均在完整代码中
创建链表–二级指针法,一级指针就带个返回参数即可
void create(Pst *List)
{
(*List) = (Pst)malloc(sizeof(st));
(*List)->data = 1;
(*List)->next = NULL;
}
创建链表–一级指针法
Pst create2(Pst List)
{
List = (Pst)malloc(sizeof(st));
List->data = 0;
List->next = NULL;
return List;
}
删除链表
void delet_destory(Pst *List)
{
Pst p;
while (p != NULL)
{
p = (*List)->next;
free((*List));
(*List) = p;
}
puts("SCESSE");
}
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} st, *Pst;
Pst createNode(int data)
{
Pst newNode = (Pst)malloc(sizeof(st));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void create(Pst *List)
{
(*List) = (Pst)malloc(sizeof(st));
(*List)->data = 1;
(*List)->next = NULL;
}
Pst create2(Pst List)
{
List = (Pst)malloc(sizeof(st));
List->data = 0;
List->next = NULL;
return List;
}
int return_length(Pst List)
{
int i = 0;
Pst replace = List;
while (replace != NULL)
{
i++;
replace = replace->next;
}
return i;
}
void insert(Pst List, int data, int pos)
{
int i;
Pst newNode = createNode(data);
if (pos < 0)
exit(0);
else if (pos > return_length(List))
{
pos = 0;
}
for (i = 0; i < pos; i++)
{
List = List->next;
}
newNode->next = List->next;
List->next = newNode;
}
Pst search(Pst List, int value)
{
if (List == NULL)
{
return List;
}
while (List->next != NULL)
{
if (List->data == value)
{
return List;
}
List = List->next;
}
return List;
}
void print_List(Pst List)
{
Pst pMove;
if (List == NULL)
{
puts("链表已毁");
exit(0);
}
pMove = List->next;
while (pMove != NULL)
{
printf("%d ", pMove->data);
pMove = pMove->next;
}
}
int merge(Pst p1, Pst p2)
{
Pst r;
create(&r);
r = p2;
while (p1->next != NULL)
{
p1 = p1->next;
}
p1->next = r->next;
return 0;
}
int delet_List(Pst List, int number)
{
int flag = 0;
Pst other;
Pst posfront = List, pos = List->next;
while (pos != NULL)
{
if (number == pos->data)
{
other = pos;
posfront->next = pos->next;
flag = 1;
free(other);
break;
}
else
{
posfront = pos;
pos = pos->next;
}
}
if (flag == 0)
{
return -1;
}
return 0;
}
Pst reverse_List(Pst List)
{
Pst pos, p, q;
pos = List->next;
p = q = NULL;
while (pos != NULL)
{
q = pos->next;
pos->next = p;
p = pos;
pos = q;
}
return p;
}
void delet_destory(Pst *List)
{
Pst p;
while (p != NULL)
{
p = (*List)->next;
free((*List));
(*List) = p;
}
puts("SCCESSE");
}
void devideList(Pst List1, Pst List2)
{
int i, j, cnt = 0;
i = return_length(List1);
j = return_length(List2);
while (cnt < i - j)
{
List1 = List1->next;
cnt++;
}
List1->next = NULL;
}
int main()
{
Pst List, List2, List3;
int data, n, ret;
Pst List_reverse;
create(&List);
create(&List_reverse);
create(&List2);
List3 = create2(List3);
puts("1:continue,0:exits");
puts("input to the choice");
scanf("%d", &n);
insert(List, 33, 0);
insert(List, 20, 0);
insert(List, 15, 0);
insert(List2, 22, 0);
while (n != 0)
{
puts("请输入你想插入的值");
scanf("%d", &data);
insert(List, data, 50);
puts("1:继续插入,,0:停止插入");
scanf("%d", &n);
}
puts("List插入后 ");
print_List(List);
puts("");
puts("List1 合并后");
merge(List, List2);
print_List(List);
print_List(List2);
puts("");
ret = delet_List(List, 20);
puts("删除 20后");
print_List(List);
puts("");
puts("单链表颠倒后");
List_reverse->next = reverse_List(List);
print_List(List_reverse);
List->next = reverse_List(List_reverse);
puts("");
puts("15为头结点开始的链(原来的链,方便后续看15节点开始那条链)");
List->next = search(List, 15);
print_List(List);
puts("\n摧毁链表2后");
devideList(List, List2);
delet_destory(&List2);
print_List(List2);
puts("\n摧毁链表1后");
delet_destory(&List);
print_List(List);
return 0;
}