1. 数据结构(c语言)单链表的问题
/*
这是结果,需要的话给我个地址
------------------------
***建立含有n个数据元素的带头结点的单链表***
请输入n = 5
请输入第1个元素:1
请输入第2个元素:2
请输入第3个元素:3
请输入第4个元素:4
请输入第5个元素:5
依次输出该表中各元素的值:1 2 3 4 5
将单链表进行逆置运算:
依次输出逆置后表中各元素的值:5 4 3 2 1
Press any key to continue
------------------------------
*/
2. C语言:如何用单链表建立一个校运动会项目管理表
初始化录入,我就录入3个学院做测试。你像录入更多,自己修改初始化函数init的变量n初值就好了。
另外,我没有写输入验证,该输入数字的地方不要输其他无关字符。想验证你可以在我的scanf那里加验证。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct race
{
char sName[50];//学院名称
char pName[50];//项目名称
int rank;//项目名次
struct race *next;
}RACE;
void pfList(RACE *raceHead);//打印链表信息
int init(RACE **raceHead,RACE **raceTail);//初始化链表,成功返回1,失败返回0
int CreatList(RACE **raceHead,RACE **raceTail);//成功返回1,失败返回0
void tjs(RACE *raceHead);//统计学院参加项目数,及所有名次为第一名的信息
void delByP(RACE *raceHead,RACE **raceTail);//根据项目删除所有节点
int main()
{
RACE *raceHead=NULL,*raceTail=NULL;
if(!init(&raceHead,&raceTail))
{
printf("程序异常终止! ");
return 1;
}
pfList(raceHead);
tjs(raceHead);
delByP(raceHead,&raceTail);
printf("删除后链表信息: ");
pfList(raceHead);
return 0;
}
int init(RACE **raceHead,RACE **raceTail)//初始化链表,成功返回1,失败返回0
{
int n=3;//初始化3个学院的信息
while(n--)
if(!CreatList(raceHead,raceTail))
return 0;
return 1;
}
void pfList(RACE *raceHead)//打印链表信息
{
printf(" 当前链表信息: ");
while(raceHead->next)
{
printf("学院名:%s ",raceHead->next->sName);
printf("--项目:%s ",raceHead->next->pName);
printf("--名次:%d ",raceHead->next->rank);
raceHead=raceHead->next;
}
}
int CreatList(RACE **raceHead,RACE **raceTail)//成功返回1,失败返回0
{
int rank;
char sname[50],pname[50];
RACE *raceNew=NULL;
if(!*raceHead)
{
*raceHead=(RACE *)malloc(sizeof(RACE));
if(!*raceHead)
return 0;
(*raceHead)->next=NULL;
}
printf("请输入参赛的学院名称:");
scanf("%s",sname);
printf("请输入参加的所有项目及名次(输入EXIT -1结束输入): ");
while(1)
{
scanf("%s%d",pname,&rank);
if(strcmp(pname,"EXIT")==0)
break;
raceNew=(RACE *)malloc(sizeof(RACE));
if(!raceNew)return 0;
strcpy(raceNew->sName,sname);
strcpy(raceNew->pName,pname);
raceNew->rank=rank;
raceNew->next=NULL;
if(!(*raceHead)->next)
(*raceHead)->next=raceNew;
else
(*raceTail)->next=raceNew;
*raceTail=raceNew;
}
return 1;
}
void tjs(RACE *raceHead)//统计学院参加项目数,及所有名次为第一名的信息
{
int cnt=0;
char sname[50];
printf(" --统计学院参加项目数,及所有名次为第一名的信息-- 输入要统计的学院名字:");
scanf("%s",sname);
printf("学院:%s在本次比赛中获得第一名的项目有: ",sname);
while(raceHead->next)
{
if(strcmp(raceHead->next->sName,sname)==0)
{
if(raceHead->next->rank==1)
printf("--项目:%s ",raceHead->next->pName);
cnt++;
}
raceHead=raceHead->next;
}
printf("学院%s共参加的项目数量为: %d ",sname,cnt);
}
void delByP(RACE *raceHead,RACE **raceTail)//根据项目删除所有节点
{
RACE *raceLast=raceHead,*raceSave=raceHead,*del=NULL;
char pname[50];
printf(" ---根据项目删除所有节点--- 输入要删除的项目名称:");
scanf("%s",pname);
while(raceHead->next)
{
if(strcmp(raceHead->next->pName,pname)==0)
{
del=raceHead->next;
raceLast->next=del->next;
free(del);
raceLast=raceSave;
raceHead=raceSave;
continue;
}
raceHead=raceLast->next;
raceLast=raceLast->next;
}
*raceTail=raceLast;
}
3. C语言:用栈来逆置一个单链表,哪位大神能给出下面代码的详细的解释谢谢
#include <stdio.h>
#include<stdlib.h>
#define stacksize 100
typedef int datatype;//这里所谓的datatype关键字是不存在的,所以这里用typedef (类型定义) 定义成int 型,意思是datatype 就是int
typedef struct
{
datatype data[stacksize];
int top;
}seqstack;//这里定义了栈(其实就是结构体,里面有个int型的数组和int型的成员),在下面有栈的一些运算,
typedef struct node
{
datatype data;
struct node *next;
}listnode;//这里定义了链表。int 型成员和 node * 指针
typedef listnode *linklist;//定义linklist指针,就是listnode 类型的指针
linklist h;
linklist p;
int x;
linklist creatlist(int n) //这里是创建链表
{
linklist h;
listnode *p1,*p2;
int i;
h=(linklist)malloc(sizeof(listnode));/*这里是为 h 这个结点(或者可称为结构体,它本来的面目),申请内存空间,大小就是(sizeof(listnode),就是结构体所占大小)*/
h->next=NULL; /*逆置单链表初始为空*/
p2=h;
printf("请输入链记录!:
");
for(i=0;i<n;i++)//这里就输入n个记录,比如1,2,3,4,5
{
p1=(linklist)malloc(sizeof(listnode));//同上
scanf("%d",&p1->data);//输入该节点中的数据成员data的值
p1->next=p2->next; /*将当前处理节点p插入到逆置L的表头*/
p2->next=p1;
p2=p1; /*p指向下一个待插入的节点*/
}
return (h);
}
void print(linklist h,int n)//将该链表打印出来
{
if(h==NULL)
printf("链表为空!
");
printf("这%d个链记录是:
",n);
p=h->next;
printf("%d",p->data);
x=1;
while(p->next!=NULL)
{
x++;
p=p->next;
printf("%4d",p->data);//这里就是P指针一直指向next, 循环打印,直到p=NULL..
if(!(x%10))
printf("
");// - -这里应该是每打印10次就换行的意思。
}
}
datatype push(seqstack *s,int x) /*这里就是栈的操作,进栈,返回类型为datatype,实际上就是int,这里说下参数,第一个参数是指向栈的指针类型,第二个参数是你要进栈的值*/
{
if(s->top==stacksize-1)//超出栈的大小
printf("堆栈溢出!
");
else
s->data[++s->top]=x;
}
datatype pop(seqstack *s) //和上面相同,这个是出栈,return 栈的元素的值
{
if(s->top==-1)
printf("堆栈为空!
");
else
return (s->data[s->top--]);
}
datatype deleted(linklist h)//删除链表结点的值,并将该结点中data值放到temp
{
datatype temp;
linklist p;
p=h->next;
temp=(p->data);
h->next=p->next;
free(p);//这步重要!释放结点所占的空间
return (temp);
}
void invertedlist(linklist h,int n)//
{
seqstack s;
int i,j,temp;
s.top=-1;
for(i=0;i<n;i++)//说白了就是将链表的值依次进栈
{
temp=deleted(h);
push(&s,temp);
}
for(i=0;i<n;i++)//然后将各个值依次出栈
{
temp=pop(&s);
printf("%5d",temp);
if(!((i+1)%10))
printf("
");
}
printf("
");
}
main()
{
linklist h;
int n;
printf("请输入n的值:
");
scanf("%d",&n);
h=creatlist(n);
print(h,n);
printf("
");
printf("经过逆置,链记录为:
");
invertedlist(h,n);
system("pause");
return 0;
}
最后总结,原理就是利用栈的先进后出的特性来实现逆置的。有什么不懂可以再提问。
4. C语言的单链表问题,谢谢解答
单链表简介
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
单链表
以"结点的序列"表示线性表称作线性链表(单链表)
单链表是链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。
因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i
单链表
1、链接存储方法
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
注意:
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。
2、链表的结点结构
┌───┬───┐
│data │next │
└───┴───┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
注意:
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
【例】线性表(bat,cat,eat,fat,hat,jat,lat,mat)的单链表示如示意图
3、头指针head和终端结点指针域的表示
单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
注意:
链表由头指针唯一确定,单链表可以用头指针的名字来命名。
终端结点无后继,故终端结点的指针域为空,即NULL。
4、单链表的一般图示法
由于我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,可以用箭头来表示链域中的指针,线性表(bat,cat,fat,hat,jat,lat,mat)的单链表就可以表示为下图形式。
5、单链表类型描述
typedef char DataType; //假设结点的数据域类型为字符
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意:
①LinkList和ListNode是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
②*LinkList类型的指针变量head表示它是单链表的头指针
③ListNode类型的指针变量p表示它是指向某一结点的指针
6、指针变量和结点变量
指针变量
结点变量
定义
在变量说明部分显式定义
在程序执行时,通过标准函数malloc生成
取值
非空时,存放某类型结点
实际存放结点各域内容的地址
①生成结点变量的标准函数
p=( ListNode *)malloc(sizeof(ListNode));
//函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中
②释放结点变量空间的标准函数
free(p);//释放p所指的结点变量空间
③结点分量的访问
利用结点变量的名字*p访问结点分量
方法一:(*p).data和(*p).next
方法二:p->data和p->next
④指针变量p和结点变量*p的关系
指针变量p的值--结点地址
结点变量*p的值--结点内容
(*p).data的值--p指针所指结点的data域的值
(*p).next的值--*p后继结点的地址
*((*p).next)--*p后继结点
注意:
① 若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。
② 有关指针类型的意义和说明方式的详细解释
可见,在链表中插入结点只需要修改指针。但同时,若要在第 i 个结点之前插入元素,修改的是第 i-1 个结点的指针。
因此,在单链表中第 i 个结点之前进行插入的基本操作为:
找到线性表中第i-1个结点,然后修改其指向后继的指针。
5. c语言构建一个最简单的单链表
typedef struct node { char name[20]; struct node *link; }stud; 下面就来看一个建立带表头(若未说明,以下所指 链表 均带表头)的单 链表 的完整程序。 #include <stdio.h> #include <malloc.h> /*包含动态内存分配函数的头文件*/ #define N 10 /*N为人数*/ typedef struct node { char name[20]; struct node *link; }stud; stud * creat(int n) /*建立单 链表 的函数,形参n为人数*/ { stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/ int i; /*计数器*/ if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/ { printf("不能分配内存空间!"); exit(0); } h->name[0]='\0'; /*把表头结点的数据域置空*/ h->link=NULL; /*把表头结点的链域置空*/ p=h; /*p指向表头结点*/ for(i=0;i<n;i++) { if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/ { printf("不能分配内存空间!"); exit(0); } p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/ printf("请输入第%d个人的姓名",i+1); scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/ s->link=NULL; p=s; } return(h); } main() { int number; /*保存人数的变量*/ stud *head; /*head是保存单 链表 的表头结点地址的指针*/ number=N; head=creat(number); /*把所新建的单 链表 表头地址赋给head*/ } 这样就写好了一个可以建立包含N个人姓名的单 链表 了。写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
6. C语言单链表
C语言创建单链表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("请输入第1个数据:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("请输入第%d个数据:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("链表创建成功!");
}
void main()
{
int n;
printf("请你输入链表的个数:");
scanf("%d",&n);
create(n);
}