链表的基本操作,可以实现以下功能:
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LNode,*LinkList;
LinkList Create_LinkList()
{
LinkList H;
H = (LinkList)malloc(sizeof(LNode));
if(H)
H->next = NULL;
return H;
}
void Destory_LinkList(LinkList *H)
{
LinkList p,q;
p = *H;
while(p)
{
q = p;
p = p->next;
free(q);
}
*H = NULL;
}
int Length_LinkList(LinkList H)
{
LinkList p = H;
int count = -1;
while(p)
{
p = p->next;
count++;
}
return count;
}
LinkList Locate_LinkList_Pos(LinkList H,int i)
{
LinkList p = H;
int j = 0;
while(p && (j < i))
{
p = p->next;
j++;
}
if((j != i) || !p)
{
printf("参数i错误或单链表不存在\n");
return NULL;
}
return p;
}
int Locate_LinkList_Value(LinkList H,DataType x)
{
LinkList p = H->next;
int n = 0;
while(p && (p->data != x))
{
p = p->next;
n++;
}
if(p == NULL)
{
printf("单链表不存在\n");
return 0;
}
printf("该值序号为%d\n",n);
return 0;
}
int Insert_LinkList(LinkList H,int i,DataType x)
{
LinkList p,q;
p = Locate_LinkList_Pos(H,i - 1);
if(!p)
{
printf("i有误\n");
return 0;
}
q = (LinkList)malloc(sizeof(LNode));
if(!q)
{
printf("节点申请失败\n");
return 0;
}
q->data = x;
q->next = p->next;
p->next = q;
return 0;
}
void Delete_LinkList(LinkList H,int i)
{
LinkList p,q;
if((H == NULL) || (H->next == NULL))
{
printf("链表不存在或者空表不能删除\n");
return;
}
p = Locate_LinkList_Pos(H,i-1);
if((p == NULL) || (p->next == NULL))
{
printf("参数i错误\n");
return;
}
q =p->next;
p->next = q->next;
free(q);
printf("删除成功\n");
}
void print(LinkList H)
{
LinkList q = H;
printf("输出为:");
if(q)
{
q = q->next;
printf("%d ",q->data);
}
printf("\n");
}
int main()
{
int n;
int len;
int i;
int x;
LinkList p,H;
H = (LinkList)malloc(sizeof(LNode));
p = (LinkList)malloc(sizeof(LNode));
while(1)
{
printf("1.初始化链表\n");
printf("2.销毁链表\n");
printf("3.求表长\n");
printf("4.按序号查找\n");
printf("5.按值查找\n");
printf("6.插入\n");
printf("7.删除\n");
printf("8.输出链表\n");
printf("9.退出程序\n");
scanf("%d",&n);
switch(n)
{
case 1: H = Create_LinkList();
break;
case 2: Destory_LinkList(&H);
break;
case 3: len = Length_LinkList(H);
printf("表长为:%d\n",len);
break;
case 4: printf("输入要查找的序号\n");
scanf("%d",&i);
p = Locate_LinkList_Pos(H,i);
printf("查找的值:%d\n",p->data);
break;
case 5: printf("输入要查找的值\n");
scanf("%d",&x);
Locate_LinkList_Value(H,x);
break;
case 6: printf("输入要插入的值\n");
scanf("%d",&x);
printf("输入要插入的序号\n");
scanf("%d",&i);
Insert_LinkList(H,i,x);
break;
case 7: printf("输入要删除的序号\n");
scanf("%d",&i);
Delete_LinkList(H,i);
break;
case 8: print(H);
break;
case 9: return 0;
}
}
}