Talk is cheap, show you the code.
#include <stdio.h>
typedef struct Node{
int date;
struct Node *Next;
} List;
List * CreateList() //创建一个带有空头结点的空链表
{
List *p;
p = (List*)malloc(sizeof(List));
p->Next = NULL;
return p;
}
int Length(List *PtrL) //求表长
{
List *p = PtrL;
int i = 0;
while(p != NULL){
p = p->Next;
i++;
}
return i-1;
}
void Append1(int x, List *PtrL) //向链表的头部添加值为x的新节点
{
List *s;
s = (List*)malloc(sizeof(List));
s->date = x;
s->Next = PtrL->Next;
PtrL->Next = s;
}
void Append2(int x, List *PtrL) //向链表的尾部添加值为x的新节点
{
List *p, *s;
p = PtrL;
while(p->Next) p = p->Next;
s = (List*)malloc(sizeof(List));
s->date = x;
s->Next = p->Next;
p->Next = s;
}
List * FindKth(int k, List *PtrL) //查找第k个节点,返回对应指针
{
List *p = PtrL;
int i = 0;
while(p!=NULL && i<k){
p = p->Next;
i++;
}
if(i==k && p!=NULL)
return p;
else
return NULL;
}
List * Find(int x, List *PtrL) //查找链表中第一个值为x的节点,返回指向该节点的指针
{
List *p = PtrL;
while(p != NULL && p->date != x)
p = p->Next;
if(!p)
printf("该节点不存在");
return p;
}
void Insert(int x, int i, List *PtrL) //在链表第i个节点的位置插入值为x的新节点
{
List *p, *s;
p = FindKth(i-1,PtrL);
if(p){
s = (List*)malloc(sizeof(List));
s->date = x;
s->Next = p->Next;
p->Next = s;
}
else
printf("该位置不存在\n");
}
void Delete1(int i, List *PtrL) //删除第i个节点
{
List *p,*s;
p = FindKth(i-1,PtrL);
if(!p || p->Next == NULL){
printf("第%d个节点不存在\n", i);
return;
}
else{
s = p->Next;
p->Next = s->Next;
free(s);
}
}
void Delete2(int x, List *PtrL) //删除所有值为x的节点
{
List *p, *s;
p = PtrL->Next;
while(p->Next){
if(p->Next->date == x){
s = p->Next;
p->Next = s->Next;
free(s);
continue; //删除操作后指针不能向后移动,防止后面相邻的节点有相同的值
}
else
p = p->Next; //若未进行删除操作,指针移向下一个节点
}
}
void ShowList(List *PtrL) //正序输出链表中所有节点的值
{
List *p;
p = PtrL;
while(p->Next){
printf("%d ", p->Next->date);
p = p->Next;
}
printf("\n");
}