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重新賦值了