#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int DataType;
typedef struct Node
{
DataType Data;
struct Node*Next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L) //带有头节点的单链表的初始化
{
(*L) = (LinkList)malloc(sizeof(Node));
if (!L)
{
printf("分配内存失败!\n");
exit(0);
}
(*L)->Next = NULL;
return 0;
}
int ListEmpty(LinkList PHead)//判断链表是否为空
{
return PHead->Next==NULL;
}
void CreatFormHead(LinkList PHead)//头插法建表
{
DataType data;
Node *s;//要插入的节点指针
scanf("%d",&data);
while(data!=-1)//输入要插入的值为-1作为结束标志
{
s=(Node*)malloc(sizeof(Node));
s->Data=data;
s->Next=PHead->Next;
PHead->Next=s;
scanf("%d",&data);
}
}
void CreatFormTail(LinkList PHead)//尾插法建表
{
Node*s;
Node*tail;
DataType data;
tail = PHead;
scanf("%d",&data);
while(data!=-1)
{
s=(Node*)malloc(sizeof(Node));
s->Data=data;
s->Next=tail->Next;
tail->Next=s;
tail=s;//tail始终指向表尾
scanf("%d",&data);
}
}
Node*Get(LinkList PHead,int i)//查找第i个元素
{
Node*p;//结点指针
int j=0;
p=PHead;
if(ListEmpty(PHead))
{
printf("表为空!\n");
return 0;
}
while(!ListEmpty(PHead)&&j<i)
{
p=p->Next;
j++;
}
if(j==i)
{
return p;//返回指向第i个节点的指针p*;
}
return NULL;
}
int Locate(LinkList PHead,DataType data)//按值查找元素位置
{
Node*p=PHead->Next;
int i=1;
while(p)
{
while(p->Data!=data)
{
p=p->Next;
i++;
}
break;//招待节点退出循环
}
return i;
}
int length(LinkList PHead)//求链表长度
{
Node *p;
p=PHead;
int len=0;
while(p->Next!=NULL)
{
len++;
p=p->Next;
}
return len;
}
void InsList(LinkList PHead,int i,DataType data)
{
Node*p;
Node*s;
p=PHead;
int j=0;
while(p->Next!=NULL&&j<i-1)
{
p=p->Next;
j++;
}
if(p==NULL)
{
return;//插入不合法
}
s=(Node*)malloc(sizeof(Node));//创建一个节点
s->Data=data;
s->Next=p->Next;
p->Next=s;
}
int DelList(LinkList PHead,int i,DataType*data)//删除操作
{
Node*p;
Node*s;
p=PHead;
int k=0;
if(i<0||i>length(PHead))
{
printf("删除位置不合法!\n");
return 0;
}
while(p->Next!=NULL&&k<i-1)
{
p=p->Next;
k++;
}
s=p->Next;
*data=s->Data;
p->Next=s->Next;
free(s);
return *data;
}
void DestoryList(LinkList PHead)//销毁链表
{
Node*p;
Node*q;
p=PHead;
while(p->Next!=NULL)
{
q=p;
p=p->Next;
free(q);
}
}
void PrintList(LinkList PHead)
{
Node*p;
p=PHead->Next;
while(p)
{
printf("%d",p->Data);
p=p->Next;
}
printf("\n");
}
/*void InitList(LinkList*PHead);
int ListEmpty(LinkList PHead);
void CreatFormHead(LinkList PHead);
void CreatFormTail(LinkList PHead);
Node*Get(LinkList PHead,int i);
int Locate(LinkList PHead,int i);
int length(LinkList PHead);
void InsList(LinkList Phead,int i,DataType data);
int DelList(LinkList PHead,int i,DataType*data);
void DestoryList(LinkList PHead);
void PrintList(LinkList PHead);*/
int main()
{
LinkList L;
LinkList L1;
DataType data;
int num;
int val;
InitList(&L);
InitList(&L1);
printf("头插法建表(L1)\n");
CreatFormHead(L1);
printf("表中元素有\n");
PrintList(L1);
printf("\n");
printf("尾插法建表(L)\n");
CreatFormTail(L);
printf("链表中的元素有\n");
PrintList(L);
printf("\n");
printf("在聊表中插入一个元素\n");
printf("请输入要插入的位置\n");
scanf("%d",&num);
printf("请输入插入的元素值:\n");
scanf("%d",&val);
InsList(L,num,val);
printf("链表中的元素有\n");
PrintList(L);
printf("\n");
printf("删除链表中的元素\n");
printf("请输入删除的位置\n");
scanf("%d",&num);
DelList(L,num,&data);
printf("删除元素的值为%d\n",data);
printf("\n");
printf("链表中的元素有: \n");
PrintList(L);
printf("\n");
printf("链表长度为:%d \n",length(L));
printf("\n");
printf("输入要查找的元素序号\n");
scanf("%d",&num);
Node* p=Get(L,num);
printf("第%d个元素的值为 %d\n",num,p->Data);
printf("请输入要查找的元素值\n");
scanf("%d",&val);
printf("%d在表中的位置序号为%d\n",val,Locate(L,val));
printf("\n");
return 0;
}
参考《数据结构实验报告》