当前位置:首页 » 编程语言 » c语言单链表项目总结
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言单链表项目总结

发布时间: 2022-12-18 08:06:44

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);

}