1. c语言的双链表问题,请问如何才能正确输出双链表元素。
我做过的作业给你,可以直接运行
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define LEN sizeof(struct DuLNode)
typedef struct DuLNode{ int data;struct DuLNode* prior;struct DuLNode* next;}DuLNode,*DuLinkList;
void CreatList_L(DuLinkList &L,int n,DuLinkList &Tail)
{ DuLinkList p,q;int i;
L=(DuLinkList)malloc(LEN);
L->next=NULL;//建立一个空的头结点,但因为它有指针域,所以它!=NULL
p=L;
for(i=1;i<=n;++i)
{q=(DuLinkList)malloc(LEN);
printf("输入一个整数:");
scanf("%d",&q->data);
q->next=L;//创建一个新结点
p->next=q;
q->prior=p;
p=q;
printf("\n");
}
Tail=q;
}
//在第i个位置前插入一结点
void ListInsert_L(DuLinkList &L,int i,int e)
{
DuLinkList p,s;int j=0;
p=L->next;
while(p!=L&&j<i-1){p=p->next;++j;}//找到第i-1个结点
if(p==L||j>i-1) printf ("插入位置错误!");
s=(DuLinkList)malloc(LEN);
s->data=e;
s->码戚next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
}
//删除第i个结点,圆宽并用e 返回其值
void ListDelete_L(DuLinkList &L,int i,int &e)
{
DuLinkList p,q;int j=0;
p=L->next;
while(p!=L&&j<迟腔陵i-1){p=p->next;++j;}
if(p==L||j>i-1) printf("删除位置错误!");
q=p->next; //使q 指向被删除结点
q->next->prior=p;
p->next=q->next;
free(q);
}
//输出循环双链表
void DisplayList_L(DuLinkList L)
{ DuLinkList p;
p=L->next;//指向第一个节点
if(p==L) printf("List is empty!");
while(p!=L)
{printf("%d,",p->data);
p=p->next;}
printf("\n");
}
void main()
{
DuLinkList L2,Tail2;int n2;n2=4;int i=2;int e=8;
CreatList_L(L2,n2,Tail2);
ListInsert_L(L2,i,e);
DisplayList_L(L2);
printf("\n");
ListDelete_L(L2,i,e);
DisplayList_L(L2);
}
2. C语言链表 输出
C语言里面的链表是一种数据结构
是一种线形的存储结构
链表和数组一样,也是将一组同类型的数据组织在一起的一种数据结构
不同的是
数组采用的是顺序存储,依靠数组的首地址和元素的相对地址(下标)来实现访问。
优点是访问方便快戚核捷,而缺点是数组是静态的,不利于埋坦实现元素的动态增减。
而链弯仔桐表采用的是离散存储,依靠节点间的指向下一个节点的指针来实现访问。
其优缺点和数组相反
链表里可以有不同种类型数据
3. C语言双向链表
#include "stdio.h"
#include "stdlib.h"
typedef int ElemType;//元素类型
typedef struct DuLNode
{//双向链表
ElemType data;
struct DuLNode *prior, *next;
}DuLNode,*DuLinkList;
int Create(DuLinkList &L)
{//建立双向链表
DuLinkList p,q;
ElemType n,i;
L = (DuLinkList) malloc (sizeof(DuLNode));
L->next = NULL;
q = L;
printf("输入数据个数:");
scanf("%d",&n);
printf("输入数据元素:");
for ( i = 0; i < n; i++)
{
p = (DuLinkList) malloc (sizeof(DuLNode));
scanf("%d",&p->data);//插入数据
p->prior = q;
q->next = p;
p->next = 0;
q = q->next;
}
return 1;
}
int Visit(DuLinkList &L)
{//遍历双向链表
DuLinkList p;
p = L->next;
printf("双向链表为:");
while (p)
{
printf("%4d",p->data);
p = p->next;
}
printf("\n");
return 1;
}
int Clear(DuLinkList &L)
{
DuLinkList p;
p = L->next;
while(p)
{
L->next = p->next;
free(p);
p = L->next;
}
return 1;
}
main()
{
int i,e,s,num;
char c='y';
DuLinkList L;
Create(L);
Visit(L);
while (c=='y')
{
printf("\n\n\n1.双向链表插入元素\n2.双向链表中删除元素\n");
printf("3.判断双向链表元素是否对称\n");
printf("4.双向链表中奇数排在偶数前面\n");
printf("5.建立递增链表并有序插入元素\n\n");
printf("选择需要的操作\n\n");
scanf("%d",&num);
switch(num)
{
case 1:
printf("输入插入元素位置以及元素:\n");
scanf("%d%d",&i,&e);
ListInsert(L, i, e);
Visit(L);
break;
case 2:
printf("输入删除元素位置:");
scanf("%d",&i);
Delete(L,i,s);
printf("删除的元素为:%d\n",s);
Visit(L);
break;
case 3:
if(Same(L)) printf("链表对称\n");
else printf("链表不对称\n");
break;
case 5:
printf("清空原链表,建立递增链表:\n");
XCreate(L);
Visit(L);
break;
case 4:
printf("奇数放在偶数前面:\n");
Jiou(L);
Visit(L);
break;
}
printf("继续操作(y/n):\n");
scanf("%s",&c);
}
}
4. C语言关于双向链表的问题:下面是代码
truct student* insert(struct student *head,struct student *stu)
{
struct student *p1,*p2;
p1=NUll; p2=head;
while(p2!=NULL&&stu->num>p2->num){
p1=p2;
p2=p2->next;
}
if(p1==NULL) head=stu;
else p1->next=stu;
stu->next=p2;
retuen head;
}
前两天作为作业,我也编了一个学生动态链表,供你参考。程序在VC++2005上编译、运行通过,链表部分使用的是标准算法。
//by 兔弟蛇哥
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NL printf("\n");
#define CLS system("CLS");
#define PAUSE system("PAUSE");
#define EMPTYLINE while(getchar()!='\n');
#define MAX_STDUENT_NUM 50 //当前允许的最大学生数以及允许的最大学号
struct student{
int number;
char name[50];
float mark[4]; //分别表示语文、数学、英语、总分
struct student *next;
};
struct student *Head;
int StudentNum;
struct student *Head_Orderly[4];
void GO(int);
void PrintStu(struct student *);
struct student* Creat(struct student*);
void SearchOrderly(int,struct student *,struct student **,struct student**);
int SeachStdNum(int,struct student *);
float InputNum(char *,int,int,char *);
int InputYN(void);
struct student* SearchStuByName(char [],struct student *);
struct student* SearchStuByNum(int,struct student *);
int DeleteByNum(int,struct student **);
int DeleteByName(char [],struct student **);
struct student *BeOrdered(struct student *,int);
void main()
{
Head=NULL;
StudentNum=0; //已输入的学生总数
int k,choice;
for(k=0;k<4;k++)
Head_Orderly[k]=NULL;
while(1){
printf("**********学生成绩动态链表示意程序**********\n\n");
printf("当前设定的最大学生数:%d\n",MAX_STDUENT_NUM);
printf("当前设定的学号范围:1-%d\n",MAX_STDUENT_NUM);
printf("1 输入新的学生数据\n");
printf("2 删除指定学生数据\n");
printf("3 查询学生成绩信息\n");
printf("0 退出\n");
NL NL
choice=(int)InputNum("请选择:",0,3,"int");
GO(choice);
}
}
void GO(int choice){
struct student *T,*p;
int number,choice2,choice3;
char name[50];
switch(choice){
case 0: exit(EXIT_SUCCESS);
case 1:
case 2: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}
printf("1 按姓名\n");
printf("2 按学号\n");
printf("3 返回\n");
NL NL
choice2=(int)InputNum("请选择:",1,3,"int");
switch(choice2){
case 3: return;
case 1: {printf("请输入要删除的学生姓名:");
scanf("%s",name);
DeleteByName(name,&Head);
break;
}
case 2: {
number=(int)InputNum("请输入要删除的学生学号:",1,MAX_STDUENT_NUM,"int");
DeleteByNum(number,&Head);
break;
}
}
break;
}
case 3: {NL NL
if(Head==NULL){
printf("很遗憾,链表中没有学生!\n");
return;
}
printf("1 查询全部\n");
printf("2 按姓名查询\n");
printf("3 按学号查询\n");
printf("4 按语文分数排序\n");
printf("5 按数学分数排序\n");
printf("6 按英语分数排序\n");
printf("7 按总分分数排序\n");
printf("8 返回\n");
NL NL
choice3=(int)InputNum("请选择:",1,8,"int");
if(choice3==8) return;
if(choice3==1)
if(choice3==2){printf("请输入要查询的学生姓名:");
scanf("%s",name);
p=SearchStuByName(name,Head);
if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
if(choice3==3){
number=(int)InputNum("请输入要查询的学生学号:",1,MAX_STDUENT_NUM,"int");
p=SearchStuByNum(number,Head);
if(p==NULL)
printf("无此学生!\n\n");
else{
T=(struct student*)malloc(sizeof(struct student));
*T=*p;
T->next=NULL;
PrintStu(T);
}
return;
}
Head_Orderly[choice3-4]=BeOrdered(Head,choice3-4);
PrintStu(Head_Orderly[choice3-4]);
return;
}
}
}
void PrintStu(struct student *head)
{
struct student *p;
int i=0;
p=head;
printf("序号\t学号\t姓名\t语文\t数学\t英语\t总分\n");
while(p!=NULL){
printf("%d\t%d\t%s\t%.1f\t%.1f\t%.1f\t%.1f\n",++i,p->number,&p->name,p->mark[0],p->mark[1],p->mark[2],p->mark[3]);
p=p->next;
}
NL NL
PAUSE
NL NL
return;
}
struct student* Creat(struct student *head) //新建或插入链表
{
struct student *p,*u,*v; //p:新建表元指针;v,u:查询时的当前表元和前驱表元的指针
p=u=v=NULL;
/*创建新表元*/
while(1){
if(StudentNum==MAX_STDUENT_NUM){
printf("学生已输满!\n\n");
return head;
}
p=(struct student*)malloc(sizeof(struct student));
while(1){
p->number=(int)InputNum("学号:",1,MAX_STDUENT_NUM,"int");
if(head==NULL||SeachStdNum(p->number,head)==0) break;//检查学号是否重复(允许不顺序输入学号)
printf("学号重复!请重输:");
}
printf("请输入姓名:");
scanf("%s",p->name);
p->mark[0]=InputNum("语文成绩:",0,100,"float");
p->mark[1]=InputNum("数学成绩:",0,100,"float");
p->mark[2]=InputNum("英语成绩:",0,100,"float");
p->mark[3]=p->mark[0]+p->mark[1]+p->mark[2];
p->next=NULL;
/*按学号顺序插入新表元*/
if(head==NULL) head=p;
else{
SearchOrderly(p->number,head,&v,&u);
if(v==NULL) head=p;
else v->next=p;
p->next=u;
}
StudentNum++;
printf("添加成功!现有学生:%d人。\n",StudentNum);
printf("是否继续(Y/N)?");
if(InputYN()==0) return head;
}
}
void SearchOrderly(int num,struct student *head,struct student **v,struct student **u)
{
struct student *u1,*v1;
v1=NULL;
u1=head;
while(u1!=NULL&&num>u1->number){
v1=u1;
u1=u1->next;
}
*v=v1;
*u=u1;
return;
}
int SeachStdNum(int num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL&&p->number!=num)
p=p->next;
if(p==NULL) return 0;
else return 1;
}
float InputNum(char *string,int range_min,int range_max,char *mode)
{
char temp[10];
int i;
int err;
char mode1[]="int";
union{
int a;
float b;
}input;
for(;;){
err=0;
printf("%s",string);
scanf("%10s",temp);
EMPTYLINE
if(strlen(temp)>4) continue;
for(i=0;temp[i]!='\0';i++)
if((isdigit(temp[i])==0&&temp[i]!='.')||(isdigit(temp[i])==0&&strcmp(mode1,mode)==0)) err=1;
if(err) continue;
if(strcmp(mode1,mode)==0){
input.a=atoi(temp);
if(input.a>=range_min&&input.a<=range_max)
return (float)input.a;
}
else{
input.b=atof(temp);
if(input.b>=(float)range_min&&input.b<=(float)range_max)
return input.b;
}
}
}
int InputYN() //检查输入。(N(n)或Y(y))
{
char t[3];
while(1){
scanf("%2s",&t);
EMPTYLINE
if(t[1]) printf("输入的字符过多!");
else if(t[0]=='Y'||t[0]=='y') return 1;
else if(t[0]=='N'||t[0]=='n') return 0;
else printf("输入有误!");
NL
printf("请重新输入:");
}
}
struct student* SearchStuByName(char name[],struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(strcmp(name,p->name)==0) return p;
p=p->next;
}
return NULL;
}
struct student* SearchStuByNum(int Num,struct student *head)
{
struct student *p;
p=head;
while(p!=NULL){
if(p->number==Num) return p;
p=p->next;
}
return NULL;
}
int DeleteByNum(int Num,struct student **head)
{
struct student *v,*u;
u=v=NULL;
SearchOrderly(Num,*head,&v,&u);
if(u==NULL||u->number!=Num){
printf("找不到此学号的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}
int DeleteByName(char name[],struct student **head)
{
struct student *v,*u;
v=NULL;
u=*head;
while(u!=NULL&&strcmp(u->name,name)){
v=u;
u=u->next;
}
if(u==NULL){
printf("找不到此姓名的学生!删除失败。");
NL NL
return 1;
}
if(v==NULL) *head=u->next;
else v=u->next;
u->next=NULL;
free(u);
StudentNum--;
printf("删除成功!现在链表中共有%d位学生。",StudentNum);
NL NL
return 0;
}
struct student *BeOrdered(struct student *head,int mode)
{
struct student *newhead,*p,*newp,*u,*v,*u2;
int i;
p=head;
newhead=u=v=NULL;
while(p!=NULL){
newp=(struct student*)malloc(sizeof(struct student));
*newp=*p;
newp->next=NULL;
if(newhead==NULL) newhead=newp;
else{
v=NULL; u=newhead;
while(u!=NULL&&newp->mark[mode]<u->mark[mode]){
v=u;
u2=u;
u=u->next;
}
if(newp->mark[mode]==u2->mark[mode]){ //如果该科成绩相等,依次以语文、数学、英语的顺序排序
for(i=0;i<3;i++){
if(newp->mark[mode]>u->mark[mode]){
v=u;
u=u->next;
break;
}
}
}
if(v==NULL) newhead=newp;
else v->next=newp;
newp->next=u;
}
p=p->next;
}
return newhead;
}
5. C语言 求双向链表的简单例子
一下是含指针的代码,什么是不含的呀?不含指针只有用数组来做,但是完全无法成为一个双向链表啊,可以说的明白一些吗?
下面就是把一些数据保存在双向链表中,然后打印输出
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
link *next;
link *pre;
int num;
}link,*Llink;
/*构建链表,长度为num*/
Llink build(int num)
{
int cun=0;
int i=0;
printf("输入要保存的第%d个数据:\n",i+1);
scanf("%d",&cun);
Llink head=(Llink)malloc(sizeof(link));
head->哗指局num=cun;
Llink x=(Llink)malloc(sizeof(link));
x=head;
for(i=1;i<num;i++)
{
printf("输入要保存的第%d个数据:\n",i+1);
scanf("乱让%d",&cun);
Llink y=(Llink)malloc(sizeof(link));
y->num=cun;
x->next=y;
y->pre=x;
x=y;
}
head->pre=x;
x->next=head;
return(head);
}
/*打印头结点为head所指向的节点的链表*/
void output(Llink head)
{
Llink x=(Llink)malloc(sizeof(link));
x=head;
do
{
printf("%d\n",x->num);
x=x->next;
}
while(x!=head);
}
void main()
{
int num;
printf("逗羡输入要保存的数据的个数:\n");
scanf("%d",&num);
Llink head=build(num);
printf("保存的数据为:\n");
output(head);
}
6. C语言关于链表的输出
肯定不要啊 链表地址是随机分配的
读写文件槐喊运有两中函数:
1. fscanf() fprintf()用法和铅梁scanf() printf()一样 就是多渗行了个文件指针。输入的东西写到文件时注意你用scanf时怎么输到显示屏上你就怎么输到文件里
2. write()read() 是模块读写具体用法翻书
7. C语言链表输出
1.我看这个链表应该是带头的链表,所以for循环前的
p=q->next;应该改成p=q;
2.链表不是数组,楼主好像没有完全理解链表。
在你的代码基础上改下:
for(i=0;i<a;i++)//p++是没雹誉桥有道理的,
{
printf("%d\t%d\t",p->num,p->age);//
p=p->虚配next;//用这个来实现查找下一个
}
不过一般情况下源猛不知道链表的长度,可以按照下面方式遍历
while(p)
{
printf("%d\t%d\t",p->num,p->age);//
p=p->next;
}
3.没有释放空间的语句,可以借鉴上述遍历的方式。
8. (C语言)动态双向循环链表读取文件并输出的问题
修改如下,主要有两个错误:
1.打开文件不能用w,因为w会破坏已经存在的文件前闭中的内容;
2.fscanf中的参数少了一个&
void read()
{
LINK pb,newnode;
FILE *fp;
int i;/*num链表插入控制*/
fp=fopen("C:\\table.txt","r");//这里要用r,不要用wt+,w会使你的文件被破坏的,所以里面的数据都有问题
for(i=0;i<5;i++)
{
printf("ok\n");
//码悔滑 getch();
newnode=(LINK)malloc(sizeof(struct list));
printf("input a data\n");
fscanf(fp,"%d\n",&newnode->data);//########这里缺少一个&,取址符########
printf("%d",newnode->data);
if(i==0)
{pb=head=newnode;head->front=NULL;head->next=NULL;}/*双向节点初始化*/
else
{ pb->next=newnode;/*建立节迟腊点连接*/
newnode->front=pb;
newnode->next=NULL;
pb=newnode;
}
}
printf("\n");
head->front=newnode;
pb->next=head;/*双循环链表建立完毕*/
fclose(fp);
}
9. c语言:双向链表逆向输出的结果最后一位数字总是-859045831
双向链表逆向输出的最后一个结果应该是用户输入的第1个值,也就是“5”。在create()函数中可以看到在获租裂缺取第一个用户输入的弊辩整数数据时使用的是scanf("%s", &n),"%s"是用来源唯获取字符串格式的数据,而不能用来获取整形数据,所以导致输出错误数据“-8590458”,应该将此处修改位scanf("%d", &n)。
10. 各位大神帮帮忙,C语言双向循环链表输入输出问题!编译连接无问题,输出有问题!
void Chushihua(struct student *p0) /*初始化表头*/
{
p0=(struct student *)malloc(sizeof(struct student));
p0->渗型蔽next->prior=p0->prior->next=p0;
} 这丛州个地方你初始化了p0,但是没有初始化p0->next啊,你用p0->next->prior会直接出错
,然后C语言不允许输入参数里面有未被初始化的指针,所以你struct student *p0也是错的(编译不会错,因为不会检查)
p1=p0;
p2=p1=(struct student *)malloc(sizeof(struct student)); //p1初始化没有什么意义,租空立马就会被malloc重新赋值了