希望以下内容可以帮助到大家^v^ 如果各位小伙伴们觉得写的不错就点一个赞再走哇,有不懂可在评论区留言,如果发现错误,欢迎大家指出来。
首先,顺序表的存储结构为:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node*next;
}LNode,*LinkNode;
//创建顺序表
LNode*creat(int n)
head为头指针,pnew为头结点,prear为尾结点,然后从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针
LNode*creat(int n)
{
LNode*head,*pnew,*prear;//LinkNode head,pnew,prear;
head=(LNode*)malloc(sizeof(LNode));//从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针
head->next=NULL;
prear=head;
for(int i=0;i<n;i++)
{ pnew=(LNode *)malloc(sizeof(LNode));
scanf("%d",&pnew->data);
prear->next=pnew;
prear=pnew;
}
prear->next=NULL;
return head;
}
//输出顺序表
void output(LNode *head)
void output(LNode *head)
{ LNode *p=head;
if(p)
p=head->next;
while(p)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//顺序表长度
int length(LNode *head)
注意:线性表长度不是0开始哦,但是数组是从0开始
int length(LNode *head)
{ LNode *p=head;
int len=0;
while(p->next)
{ p=p->next;
len++;
}
return len;
}
//按位置查找,线性表第i个位置元素返回给e
LNode *getElem(LNode *head,int i)
注意事项:
1.判断p或者p->next是否为空
2.查找位置不合法就返回NULL
LNode *getElem(LNode *head,int i)
{ LNode *p=head;
int j=0;
while(p->next&&j<i)//p&&j<i
{ p=p->next;
j++;
}
if(j==i) return p;
else return NULL;
}
//按值查找
LNode *lacateElem(LNode *head,ElemType x)
注意事项:
1.判断p或者p->next是否为空
2.如果查找成功,之后就输出该值。.查找值不成功就返回NULL
LNode *lacateElem(LNode *head,ElemType x)
{ LNode *p=head->next;
while(p&&p->data!=x)
{
p=p->next;
}
if(p)
return p;
else
return NULL;
}
//插入
void insertLink(LNode *head,int i,ElemType x)
注意事项:
1.判断p或者p->next是否为空
2.插入位置的合法性
void insertLink(LNode *head,int i,ElemType x)
{
LNode *p=head,*s;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(p!=NULL&&j==i-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
}
}
//删除
void intdelLink(LNode*head,int i)
注意:要释放删除的结点
void intdelLink(LNode*head,int i)
{
LNode*p=head,*s;
p=getElem(p,i-1);
if(p!=NULL&&p->next!=NULL)
{
s=p->next;
p->next=s->next;
free(s);
}
}
以上就是顺序表的基本步骤,下面附上顺序表的完整代码:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node*next;
}LNode,*LinkNode;
//创建顺序表
LNode*creat(int n)
{
LNode*head,*pnew,*prear;//LinkNode head,pnew,prear;
head=(LNode*)malloc(sizeof(LNode));//从内存中提取一块size大小的内存并向该程序返回一个指向这块内存的指针 ,该内存未初始化。如果申请失败,malloc返回一个NULL指针
head->next=NULL;
prear=head;
for(int i=0;i<n;i++)
{ pnew=(LNode *)malloc(sizeof(LNode));
scanf("%d",&pnew->data);
prear->next=pnew;
prear=pnew;
}
prear->next=NULL;
return head;
}
//输出顺序表
void output(LNode *head)
{ LNode *p=head;
if(p)
p=head->next;
while(p)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//顺序表长度
int length(LNode *head)
{ LNode *p=head;
int len=0;
while(p->next)
{ p=p->next;
len++;
}
return len;
}
//按位置查找,线性表第i个位置元素返回给e
LNode *getElem(LNode *head,int i)
{ LNode *p=head;
int j=0;
while(p->next&&j<i)//p&&j<i
{ p=p->next;
j++;
}
if(j==i) return p;
else return NULL;
}
//按值查找
LNode *lacateElem(LNode *head,ElemType x)
{ LNode *p=head->next;
while(p&&p->data!=x)
{
p=p->next;
}
if(p)
return p;
else
return NULL;
}
//插入
void insertLink(LNode *head,int i,ElemType x)
{
LNode *p=head,*s;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(p!=NULL&&j==i-1)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
}
}
//删除
void intdelLink(LNode*head,int i)
{
LNode*p=head,*s;
p=getElem(p,i-1);
if(p!=NULL&&p->next!=NULL)
{
s=p->next;
p->next=s->next;
free(s);
}
}
int menu()
{ int i;
printf("|-----顺序表基本操作------|\n");
printf("|-----1.输出--------------|\n");
printf("|-----2.按位置查找--------|\n");
printf("|-----3.按值查找----------|\n");
printf("|-----4.求表长------------|\n");
printf("|-----5.插入--------------|\n");
printf("|-----6.删除--------------|\n");
printf("|-----0.退出-----\n");
do{ printf("请输入选项(0-7):");
scanf("%d",&i);
}while(i<0||i>6);
return i;
}
int main()
{ LNode *head;int n;
scanf("%d",&n); head=creat(n);
while(1)
{ switch(menu())
{case 0:exit(0);break;
case 1:output(head);break;
case 2:{int i;LNode *p;
printf("输入查找的序号:");
scanf("%d",&i);
p=getElem(head,i);
if(p) printf("第%d个位置的值是%d\n",i,p->data);
else printf("查找失败\n");
break;
}
case 3:{int i;LNode *p;
printf("输入查找的值:");
scanf("%d",&i);
p=lacateElem(head,i);
if(p)
printf("结点的值:%d\n",p->data);
else printf("查找失败\n");
break;
}
case 4:{
printf("%d\n",length(head));
break;
}
case 5:{printf("输入插入的元素和位置");
int x,i;
scanf("%d%d",&x,&i);
insertLink(head,i,x);
output(head);
break;
}
case 6:{int i;
printf("输入删除的位置:");
scanf("%d",&i);
intdelLink(head,i);
output(head);
break;
}
}
}
return 0;
}
附上运行结果: