扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
敢问楼主,为何要两个链表?你的需求一个链表完全搞定了啊,第二个链表是用来做什么的?
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计制作、做网站、韶山网络推广、小程序定制开发、韶山网络营销、韶山企业策划、韶山品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供韶山建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
#includestdio.h
#includestdlib.h
struct student{
char name[10];
char id[10];
struct student *next;
};
int main(void)
{
int n;
printf("请输入要学生个数,以回车结束!\n");
scanf("%d",n);
struct student *head=(struct student *)malloc(sizeof(struct student));
head-next=NULL;
struct student *end=head;
for(int i=0;i!=n;i++)
{
struct student*p=(struct student *)malloc(sizeof(struct student));
p-next=NULL;
printf("第%d个学生信息:\n",i+1);
printf(" 姓名:");
scanf("%s",p-name);
printf(" 学号:");
scanf("%s",p-id);
end-next=p;
end=p;
}
for(struct student *p=head-next;p!=NULL;p=p-next)
{
printf("姓名:%s 学号:%s \n",p-name,p-id);
}
}
截图如下:
如果已知一个节点指针pre和一个节点指针cur,要把cur插入到pre节点之后,很显然要保证链表不会断开而丢失后面的节点,要先把后面的节点指针(指向lat的指针)保存下来,即有cur-next
=
pre-next,然后把cur连接的一串链表连接到pre后面,即pre-next
=
cur;
上面介绍了,在一个节点之后插入节点的情况。这是通常的情况。如果要向一个链表的头部插入节点,就只需要将新节点的下一个指针指向链表的头指针即可。
在这种情况下,有两点要注意:
1,链表是否为空链表
2,要插入的节点是不是空指针。
代码实现:
//向单链表中插入一个节点(插入在链开始处)
//输入参数:单链表的头指针和要插入的节点指针
//输出参数:无
//返回值:指向单链表的头指针
singlelist*
insert(singlelist
*head,singlelist
*node)
{
if(node
==
null)
{
return
head;
}
else
if(head
==
null)
{
return
node;
}
node-next
=
head;
head
=
node;
return
head;
}
#includestdio.h
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定义数据类型名称
typedef int DataType;
#define flag -1 //定义数据输入结束的标志数据
//单链表结点存储结构定义
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立单链表子函数
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针
while(1)
{
scanf("%d",x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函数(按序号查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是计数器,用来判断当前的结点是否是第i个结点
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ; //当前结点p不是第i个且p非空,则p移向下一个结点
j++;
}
return p;
}
//插入运算子函数
void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点
{
LNode *p,*s;
p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//单链表的删除运算子函数
void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作
exit(-1);
}
else
{
q=p-next ;
p-next =p-next-next;
free(q);
}
}
}
//求表长运算子函数
int Length_LinkList(LinkList L)
{
int l; //l记录L的表长
LNode *p;
p=L;
l=1;
while(p-next)
{
p=p-next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu*******\n");
printf("**创建**********1*\n");
printf("**插入**********2*\n");
printf("**删除**********3*\n");
printf("**表长**********4*\n");
printf("**清屏**********5*\n");
printf("**打印**********6*\n");
printf("**退出******other*\n");
printf("******************\n");
int i=1;
while(i)
{
printf("请输入选项:");
scanf("%d",i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("请输入位置和数据;");
scanf("%d%d",x,y);
Insert_LinkList(head,x,y);break;
case 3:printf("请输入位置;");
scanf("%d",x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d\n",p-data);
p=p-next;}
break;
default :i=0;
}
}
}
我把创建给改了一下
#include stdio.h
#include stdlib.h
#define M 2
int n,i,j,x; //定义变量 ,M为行,n为列,i、j为循环变量,x为自变量
typedef struct Node //建立线性链表
{
int a[M][1];//定义一个列数组
struct Node*next;//指针成员
}LNode;
void create(LNode*head);//创建线性链表函数声明
void display(LNode*head);//显示线性链表函数声明
void Deleteline(LNode*head);//删除链表中的某几列函数声明
void Change(LNode*head);//改变链表中数据的函数的声明
int main(int argc, char *argv[])
{
printf("列表目前行数等于2\n");
printf("目前列数等于0\n");//表示 m行0列
LNode*head;//定义链表头指针
head=(LNode*)malloc(sizeof(LNode));//分配空间
head-next=NULL;//下一个为空
create(head);//建立线性链表
display(head);//显示线性链表
Deleteline(head);//删除某一列
display(head);//显示
Change(head);//改变元素
system("PAUSE");
return 0;
}
void create(LNode*head)
{
LNode*p,*rear=head;//空的线性链表头和尾
printf("输入 '0'或'1'\n如果您输入 '0',则结束输入:");
scanf("%d",x);
n=0;//表示有0列
while(x)//输入"0"则退出
{ if(!n)
printf("输入第一列:\n");
else printf("输入下一列:\n");
p=(LNode*)malloc(sizeof(LNode));//为指针分配空间
for(i=0;iM;i++)//循环输入该列的每一行每一个元素
{ scanf("%d",x);
p-a[i][0]=x;
}
p-next=NULL;//新追加的结点为尾结点,后继为空
rear-next=p;//新追加的结点在最后,也就是rear的后继
rear=p;//新追加的结点为新的表尾,rear指向新的表尾
printf("输入 '0'或'1'\n如果您输入 '0',则结束输入:");
scanf("%d",x);
n++;//列数自增一
}
}
void display(LNode*head)//列表显示函数
{
LNode*p=head-next;//定义指针成员指向表头
printf("列表\n");//显示列表名称并换行
for(j=0;jM;j++)
{
for(i=0;in;i++)//执行 “行循环 ”
{
printf("%d\t",p-a[j][0]); //
p=p-next;//p指向下一元素
}
p=head-next;//重新指到表头
printf("\n");//换行
}
printf("n=%d\n",n);
}
void Deleteline(LNode*head)
{
LNode*p=head-next;//定义成员指针
int k;//定义所删除的列序号
printf("输入您要删除的列序号:");//提示输入列序号
scanf("%d",k);//接收列序号
if(k==1)
{
head-next=p-next;//将头指针的后继变为第二列
free(p);//释放空间
n--;//n自减
printf("n=%d\n",n);
}
else if(kn)
{
for(i=2;ik;i++)//循环找到节点的前驱
{
p=p-next;
}
LNode*q=p-next;//定义指向所删除列的指针
p-next=q-next;//把所删除的列节点的后继赋给其前驱的后继
free(q);//释放空间
n--;
printf("n=%d\n",n);
}
else
{
for(i=1;ik;i++)//直接找到
{
p=p-next;
}
free(p);//释放
n--;
printf("n=%d\n",n);
}
}
void Change(LNode*head)
{
int k;//定义所要改变的元素的列数
LNode*p=head-next;//定义指向第一个元素的结构指针
printf("输入您要改变的元素的行坐标:");//提示输入要改变的元素的行坐标
scanf("%d",j);//接收
printf("输入您要改变的元素的列坐标:");//提示输入要改变的元素的列坐标
scanf("%d",k);//接收
for(i=1;ik;i++)//找到
{
p=p-next;
}
printf("请输入改变后的值:");//提示输入改变的值
scanf("%d",x);//接收
p-a[j-1][0]=x;//传值
display(head);//再现
}
我这是一个链表构造的列表,功能有:建立一个列表、删除一列,显示列表、改变具体位置的元素值四个大功能。不过行数初始化确定了的,是2,你也可以自己设计如何在dos窗口动态输入。注释都有,你自己还可以修改其中的函数和语句,使这个结构功能变得更强大。
希望对你有所帮助!!!
struct
student
*creat(void)
{struct
student
*head;
struct
student
*p1,*p2;
n=0;
p1=p2=(struct
student*)malloc(len);
//这里格式化输入二个数0,0
scanf("%ld,%f",p1-num,p1-score);
//head赋值为null
head=null;
//刚才输入的是0因此不满足条件一次循环都不走
while(p1-num!=0)
{
n=n+1;
if(n==1)head=p1;
else
p2-next=p1;
p2=p1;
p1=(struct
student*)malloc(len);
scanf("%ld,%f",p1-num,p1-score);
}
p2-next=null;
//所以这时候head还是最初赋的值null自然打不出信息
return(head);
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流