代码展示
#include<stdio.h>
#include<stdlib.h>
//单链表的定义
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}*LinkList, LNode;
//头插法建立链表
LinkList List_HeadInsert(LinkList&L)
{
int x = 0;
LNode*s;
L = (LinkList)malloc(sizeof(LNode));//创建一个头节点
L->next = NULL;
scanf("%d", &x);//输入头节点的数值
while (9999 != x)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
return L;
}
//尾插法
LinkList List_TailInsert(LinkList&L)
{
int x = 0;
L = (LinkList)malloc(sizeof(LNode));//建立头指针
LNode *r=L, *s;//*r为表尾指针
scanf("%d",&x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
//打印函数
void Print(LinkList L)
{
L = L->next;
while (L!=NULL)
{
printf("%3d",L->data);
L = L->next;
}
printf("\n");
}
//查找指定位置的元素的函数
LNode*GetElem(LinkList L, ElemType i)
{
int j = 1;
LNode*p = L->next;
if (i==0)
{
return L;
}
if (i < 1)
return NULL;
while (p&&j<i)
{
p=p->next;
j++;
}
return p;
}
//按值查找表节点
LNode*LocateElem(LinkList L,ElemType e)
{
LNode*p = L->next;
while (p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
//插入节点操作
bool ListFrontInsert(LinkList L,int i,ElemType e)
{
LinkList p = GetElem(L,i-1);
if (NULL == p)
{
return false;
}
//为新插入的节申请空间
LinkList s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//删除节点操作
bool ListDelete(LinkList L,int i)
{
LinkList p = GetElem(L,i-1);
if (NULL == p)
{
return false;
}
LinkList q = p->next;
p->next = q->next;
free(q);
q = NULL;
return true;
}
int main()
{
LinkList L;//链表头,
printf(" 1.头插法输入数据3,4,5,6,7以9999作为结束标 \n ");
List_HeadInsert(L);//输入数据3,4,5,6,7,9999
Print(L);//打印数据为7,6,5,4,3,
printf(" 2.尾插法输入数据3,4,5,6,7以9999作为结束标 \n ");
List_TailInsert(L);
Print(L);//打印数3,4,5,6,7
printf(" 3.按序号查找节点值\n ");
printf("请输入你要查找第几个的节点:");
int x = 0;
scanf("%d",&x);
LinkList search=GetElem(L,x);
if (search != NULL)
{
printf("按序号查找成功!\n");
printf("%d",search->data);
}
printf("\n");
printf(" 4.按值查找表节点\n ");
printf("请输入你要查找的元素:");
scanf("%d", &x);
LinkList search1 = LocateElem(L, x);
if (search != NULL)
{
printf("按值查找成功!\n");
printf("%d", search1->data);
}
printf("\n");
printf(" 5.插入接点操作\n ");
printf("请输入你要插入的位置和值:");
int plot = 0;
ElemType num = 0;
scanf("%d %d",&plot,&num);
ListFrontInsert(L,plot,num);
Print(L);
printf(" 6.删除节点的操作\n ");
printf("请输入你要删除的节点:");
int del = 0;
scanf("%d",&del);
ListDelete(L, del);
Print(L);
system("pause");
return 0;
}
结果展示
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}*LinkList,LNode;
//头插法建立链表
LinkList List_HeadInsert(LinkList &L)
{
//创建头节点
printf("头插法建立链表,以9999位结束标志\n");
ElemType e;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&e);
while (e!=9999)
{
LNode*s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L->next;//用来存放上次开辟节点元素的地址
L->next = s;//存放刚刚开辟元素的地址
scanf("%d",&e);
}
return L;
}
//查找指定位置的元素的函数
LNode*GetElem(LinkList L,int i)
{
int j = 1;
if (i==0)
{
return L;
}
if (i<1)
{
return NULL;
}
LNode*p = L->next;
while (p&&j<i)
{
p = p->next;
j++;
}
return p;
}
//尾插
void List_TrailInsert(LNode*&L)
{
int x = 0;
printf("尾插法建立链表,以9999位结束标志\n");
//建立头节点
L = (LinkList)malloc(sizeof(LNode));
LNode*r = L, *s;//*r为表尾指针
scanf("%d",&x);
while (x!=9999)
{
s=(LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
//插入节点操作
LNode* ListFrontInsert(LinkList &L, int i, ElemType e)
{
LinkList p = GetElem(L,i-1);
if (NULL == p)
{
return NULL;
}
LinkList s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return L;
}
//打印函数
void Print(LNode*L)
{
L = L->next;
while (L!=NULL)
{
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//按值查找表节点
int LocateElem(LinkList L, ElemType e)
{
int j = 1;
LNode*p = L->next;
while (p != NULL&&p->data != e)
{
p = p->next;
j++;
}
return j;
}
//删除节点操作
LinkList ListDelete(LinkList& L, int i)
{
LinkList p = GetElem(L,i-1);
if (NULL == p)
{
return NULL;
}
LinkList q = p->next;
p->next = q->next;
free(q);
q = NULL;
return L;
}
//链表头
LinkList L;
void test1()
{
List_HeadInsert(L);
Print(L);
}
void test2()
{
List_TrailInsert(L);
Print(L);
}
void test3()
{
List_TrailInsert(L);
printf("查找第二个节点元素的值\n");
LNode*search=GetElem( L,2);
if (search!=NULL)
{
printf("按序号查找成功!\n");
printf("%3d", search->data);
}
printf("\n");
}
void test4()
{
List_TrailInsert(L);
printf("元素为4所在节点的位置\n");
int j=LocateElem(L, 4);
printf("所在的位置%3d\n",j);
}
void test5()
{
List_TrailInsert(L);
printf("在第2个位置插入元素为4值\n");
ListFrontInsert(L, 2, 4);
Print(L);
}
void test6()
{
List_TrailInsert(L);
printf("在把第2个位置的元素删除\n");
ListDelete(L, 2);
Print(L);
}
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
system("pause");
return 0;
}