⑴ 逆序輸入n個數據元素的值,建立帶頭結點的單鏈表的c語言程序,怎麼做
#include
#include
#include
//函數結果狀態代碼
#define OK 1
#define ERROR 0
//Status是函數的類型,其值是函數結果狀態代碼
typedef int Status;
typedef int ElemType;
//----線性表的單鏈表存儲結構----
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
void CreateList_L(LinkList &L,int n){
//逆位序輸入n個元素的值,建立帶表頭結點的單鏈線性表L。
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //先建立一個帶頭結點的單鏈表
for (int i=n;i>0;--i){
LinkList p = (LinkList)malloc(sizeof(LNode)); //生成新結點
scanf("%d",&p->data); //輸入元素值
p->next = L->next;L->next = p; //插入到表頭
}
}//CreateList_L
Status ListShow_L(LinkList L){
//將帶頭結點的單鏈線性鏈表L的元素列出。
LinkList p = L;
while(p->next){p = p->next;printf("%d ",p->data);}
return OK;
}//ListShow_L
void main(){
int n;
printf("請輸入將要載入鏈表的元素個數:");
scanf("%d",&n); //初始化線性鏈表元素的個數
printf("請逆序輸入%d個元素的值:\n",n);
LinkList L;
CreateList_L(L,n); //初始化線性鏈表
ListShow_L(L); //輸出線性鏈表元素的值
}
⑵ c語言題:在鍵盤輸入10個整數 逆序存放並輸出
比較簡單的方法是創建一個數組
從下標為9開始遞減進行輸入至下標為0
這樣存儲就會是倒序的了
然後再從下標為0開始遞增輸出到下標為9
另一種方法是創建兩個數組
比如a和b,先順序地將10個數據存儲在a里
然後通過一個循環來將數據逆序存儲在數組b里
這樣數組b里就是逆序存儲的了
最後順序輸出數組b
當然還有一種方法
可以使用一個鏈表(或者數組也可以)
然後使用棧的方式存儲數據
題目中要求數據的存放是逆序的
這其實要具體地看存儲的方式了
以棧來說,棧是一種先進後出的數據結構
從這種層面上來看的話它存儲的數據就是「逆序」的
但如果使用一個數組來實現的話存儲在數組里的數據就可能是順序的(不使用逆序有方式將數據存儲在數組里)
一個簡單的例子
#include<stdio.h>
#definePUSH(i)(*p=i,++p)
#definePOP(i)(--p,i=*p)
intmain(intargc,char**argv)
{
inta[10];
inti,r;
int*p=a;
for(i=0;i<10;++i)
{
scanf("%d",&r);
PUSH(r);
}
for(i=0;i<10;++i)
{
POP(r);
printf("%d",r);
}
printf(" ");
return0;
}
該例子,如果從棧這種數據結構的方式來看
先輸入的數據會被壓入到棧底
最後的數據在棧頂,從棧頂到棧底來看的話
數據的存儲就是逆序的
如果從數組下標來看的話就是順序的
這里我們可以將指針反轉過來
#include<stdio.h>
#definePUSH(i)(*p=i,--p)
#definePOP(i)(++p,i=*p)
intmain(intargc,char**argv)
{
inta[11];
inti,r;
int*p=a+10;
for(i=0;i<10;++i)
{
scanf("%d",&r);
PUSH(r);
}
for(i=0;i<10;++i)
{
POP(r);
printf("%d",r);
}
printf(" ",a[0]);
return0;
}
那麼在數組的層面上來說也會是逆序的了
而以數組的順序或逆序方式來說的話
使用鏈表的方式則已經沒有相對明確的「順序」或者「逆序」了
當然我們也可以使用逆序鏈表的方法業創建棧數據結構
由於棧數據結構的性質決定了這種數據存儲的方式
⑶ C語言鏈表節點逆序問題
首先說你十個字元串輸出結果是九個字元串的問題,你好好看你的for循環代碼,你實際上只能輸入九個字元串的,並不是你提示的那樣能輸入是個字元串,你好好看看i的邊界問題。
然後就是輸出九個字元串都是一樣的問題,你先看你輸入的字元串用的是什麼接收(就是用的什麼變數),九個字元串,你都用的a指針指向的那個空間,問題來了。對於鏈表中的節點,他們自己其實都是獨立的存儲空間,比如第一個節點用的是地址為1的空間,第二個節點用的地址為100的空間,他們都是相互獨立的,而你的代碼,所有節點都是用的a指針指向的那個內存空間。所以實際上你的鏈表只有一個有效節點的,並不是你想的那樣哦。然後你鏈表都是同一個內存空間,而且你輸入也是用的這個空間,對於輸入來說,你重復的用的話,它就是重復的覆蓋而已,你第一個字元串是abc 那麼當第二個字元串輸入時(假設bcd),那麼bcd就會把abc覆蓋掉,這就是為什麼你輸出會是最後一個串輸出九次的原因,不知道懂了沒,這個要有點點計算機內存的知識。。。
⑷ 鍵盤輸入一組數字,用單鏈表形式存儲,輸入完成後分別按順序和逆序輸出所輸入數字。
樓主你好
具體代碼如下:
#include<stdio.h>
#include<stdlib.h>
#define MAX 80
typedef struct node
{
int data;
struct node *next;
}N;
N *head=(N *)malloc(sizeof(N));//創建頭結點
void Creat()
{
N *p;//用於插入新節點
N *r=head;//尾指針 開始指向頭結點
printf("請輸入任意個數據(用回車結束輸入、空格間隔:1 2 3……)\n:");
do{
p=(N *)malloc(sizeof(N));
scanf("%d",&p->data);
r->next=p;
r=p;
}while(getchar()!='\n');
r->next=NULL;
}
void Disp()//實現順序輸出和逆序輸出
{
N *p=head->next;//用於遍歷單鏈表
int a[MAX];
int i=0,j;
printf("順序輸出:\n");
while(p)
{
printf("%d ",p->data);
a[i]=p->data;
p=p->next;
i++;
}
printf("\n逆序輸出:\n");
for(j=i-1;j>=0;j--)
printf("%d ",a[j]);
printf("\n");
}
void main()
{
Creat();
Disp();
}
希望能幫助你哈
⑸ 鏈表的逆序輸出(遞歸調用 )
是函數調用棧存儲的指針。每次遞歸調用,函數幀棧裡面都存放了指針。
上面函數遞歸調用的最後一次,l為null,之後函數調用棧依次彈出,獲得前面的地址值。
即push到最後,全pop出來。
⑹ 鏈表結點的逆序存放怎麼寫
typedef struct node
{
node() { next=NULL;}
int data;
node* next;
} node , * pnode;
pnode reverse(pnode L)
{
if (L==NULL || L->next==NULL)
{
return L;
}
else
{
pnode p=L->next;
pnode newhead=L;
pnode q=L;
newhead->next=NULL;
while (p!=NULL)
{
q=p;
p=p->next;
q->next=newhead;
newhead=q;
}
return newhead;
}
}
⑺ 用鏈表的形式存儲一個字元串 按正序和逆序輸出字元串(數據結構考試)
這個字元串的輸出,考慮到有正序和逆序,採用鏈表,可以考慮用雙鏈表。這樣輸出效率會比較高。
建議用循環雙鏈表(帶頭結點),方便程序處理,簡化操作流程,步驟明晰,便於調試。
關鍵函數可分為:
1,結構的定義
2,初始化鏈表
3,輸出(正序,逆序)
4,釋放鏈表
5,主函數
以下C語言代碼在VC6.0中編譯通過:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
/*定義*/
typedefstructnode
{
charc;
structnode*llink,*rlink;
}stud;
/*建立鏈表*/
stud*creat(void)
{
stud*p,*h,*s;
chara;
if((h=(stud*)malloc(sizeof(stud)))==NULL)
{
printf("不能分配內存空間!");
exit(0);
}
h->c=0;
h->llink=NULL;
h->rlink=NULL;
p=h;
while(1)
{
a=getchar();
if(a==' ')
break;
if((s=(stud*)malloc(sizeof(stud)))==NULL)
{
printf("不能分配內存空間!");
exit(0);
}
p->rlink=s;
s->c=a;
s->llink=p;
s->rlink=NULL;
p=s;
}
h->llink=s;
p->rlink=h;
return(h);
}
/*正序*/
voidprint1(stud*h)
{
stud*p;
p=h->rlink;
printf("字元串(正序):");
while(p!=h)
{
printf("%c",p->c);
p=p->rlink;
}
printf(" ");
}
/*逆序*/
voidprint2(stud*h)
{
stud*p;
p=h->llink;
printf("字元串(逆序):");
while(p!=h)
{
printf("%c",p->c);
p=p->llink;
}
printf(" ");
}
/*釋放*/
voidfree_stud(stud*h)
{
stud*p,*q;
p=h->llink;
while(p!=h)
{
q=p;
p=p->llink;
free(q);
}
free(h);
}
/*主函數*/
intmain()
{
stud*head=NULL;
head=creat();
print1(head);
print2(head);
free_stud(head);
return0;
}
⑻ 有一個逆序排列的序列,用帶頭結點的單鏈表存儲,頭結點地址在h中,設計演算法,正序輸出該序列
設有一個帶頭結點的單鏈表,寫一個程序將鏈表顛倒過來
⑼ 數據結構鏈表儲存刪除按逆輸出
遍歷一遍,找出最大值和最小值,並將鏈表反向,然後遍歷鏈表,刪除最大值和最小值節點
⑽ 求助:單鏈表逆序排列問題,編程高手進!!
給你個圖易理解些(圖做的不好)。
稱已完成逆置的鏈表為鏈表x
L:鏈表x的表頭
L->next:鏈表x的第一個節點
p:待插入到鏈表x的節點
每次將p插入到L與L->next之間即可完成逆置
(原鏈表為空時該演算法也能保證正確,這個你自己看看吧,不解釋了)