链表的建立、插入、删除、查找等操作(按给定值进行查找);
参考如下:
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node* next;
}SlinkNode;
//1初始化链表
SlinkNode* InitLink(SlinkNode* h)
{
h = (SlinkNode*) malloc(sizeof(SlinkNode));
h->next = NULL;
return h;
}
//2尾插法
SlinkNode* InsertLinkTail(SlinkNode* h,ElemType e)
{
SlinkNode* p=h->next;
SlinkNode* t = (SlinkNode*)malloc(sizeof(SlinkNode));
t->data = e;
t->next = NULL;
if(p==NULL)
h->next = t;
else
{
while (p->next)
{
p = p->next;
}
p->next = t;
}
return h;
}
//3显示链表
void showList(SlinkNode* h)
{
SlinkNode* p = h->next;
while (p)
{
printf("%c ",p->data);
p = p->next;
}
printf("\n");
}
//4.头插法
SlinkNode* InsertHead(SlinkNode* h,ElemType e)
{
SlinkNode *t;
t = (SlinkNode*)malloc(sizeof(SlinkNode));
t->data = e;
t->next = h->next;
h->next = t;
return h;
}
//5.链表的长度
int Length(SlinkNode* h)
{
SlinkNode* p = h->next;
int len=0;
while(p)
{
len++;
p = p->next;
}
return len;
}
//6.获取pos位置处的元素
int GetElement(SlinkNode* h,int pos,ElemType* e)
{
SlinkNode* p = h->next;
if(pos <1 || pos > Length(h) ) return 0;
while(--pos)
{
p = p->next;
}
if(p)
{
*e = p->data;
return 1;
}
return 0;
}
//7.获取第一个元素e的位置
int GetElePos(SlinkNode* h,ElemType e)
{
SlinkNode* p = h->next;
int i = 1;
while(p)
{
if(p->data == e) return i;
i++;
p = p->next;
}
return 0; //没找到返回0
}
//8.在pos位置插入元素
SlinkNode* InsertAt(SlinkNode* h,int pos,ElemType e)
{
SlinkNode* p,*t;
if (pos <1 || pos > Length(h))
{
return 0;
}
t = (SlinkNode*)malloc(sizeof(SlinkNode));
t->data = e;
p = h;
while(--pos && p)
{
p = p->next;
}
if(p)
{
t->next = p->next;
p->next = t;
}
return h;
}
//10.删除pos位置的元素
SlinkNode* DeleteEleAt(SlinkNode* h,int pos)
{
SlinkNode* p,*t;
if (pos<1 || pos >Length(h))
{
return h;
}
p = h;
t = p->next;
while(--pos && t)
{
p = t;
t = t->next;
}
p->next = t->next;
free(t);
t = 0;
return h;
}
void FreeList(SlinkNode* h)
{
SlinkNode* p;
while(h)
{
p = h->next;
free(h);h=0;
h = p;
}
}
int main()
{
SlinkNode* h = 0;
int i;
ElemType ch;
char zm[]={'a','b','c','d','e'};
char sz[]={'1','2','3'};
//初始化单链表h
h = InitLink(h);
//尾插法插入
for(i=0;i<5;i++)
h = InsertLinkTail(h,zm[i]);
//输出单链表
showList(h);
//头插法插入1 2 3
for(i=0;i<3;i++)
h = InsertHead(h,sz[i]);
printf("链表长度:%d\n",Length(h));
printf("显示链表:");
showList(h);
//显示序号为3的元素
GetElement(h,3,&ch);
printf("序号为3的元素:%c\n",ch);
//'a'的位置
i = GetElePos(h,'a');
printf("a的位置:%d\n",i);
//在第4位置插入*
h = InsertAt(h,4,'*');
//显示链表
printf("在第4个位置插入*后链表数据:");
showList(h);
//删除第3个元素
h = DeleteEleAt(h,3);
//显示链表
printf("删除第3个元素后链表数据:");
showList(h);
//释放链表
FreeList(h);
return 0;
}