當前位置:首頁 » 服務存儲 » 鏈式存儲逆序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

鏈式存儲逆序

發布時間: 2022-06-09 03:08:40

❶ 已知長度為n的線性表A採用鏈式存儲結構

// 可以通過排序解決,也可以直接倒置鏈表
// 下面是鏈表倒置代碼(假定被倒置的鏈表沒有頭結點)
LinkList *Inversion(LinkList *head) {
LinkList *p = NULL,*q = head,*t;
t = q->next;
while(q) {
q->next = p;
p = q;
q = t;
t = t->next;
}
head = p;
return head;
}

❷ 數據結構:線性表的鏈式存儲(要求如下)跪求指教

這樣的態度....悲哀

❸ 鏈式存儲序列能用冒泡排序嗎

可以啊,冒泡排序就是和鄰居逆序時交換記錄或者關鍵字,在單鏈表上可以完成下沉的冒泡排序,雙鏈表則還可以完成上浮的冒泡排序

❹ 鍵盤輸入一組數字,用單鏈表形式存儲,輸入完成後分別按順序和逆序輸出所輸入數字。

樓主你好
具體代碼如下:
#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();
}

希望能幫助你哈

❺ 用鏈表的形式存儲一個字元串 按正序和逆序輸出字元串(數據結構考試)

這個字元串的輸出,考慮到有正序和逆序,採用鏈表,可以考慮用雙鏈表。這樣輸出效率會比較高。

建議用循環雙鏈表(帶頭結點),方便程序處理,簡化操作流程,步驟明晰,便於調試。

關鍵函數可分為:

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;

}

❻ 怎麼把二叉樹的鏈式存儲結構轉化為順序存儲結構

二叉樹的鏈式存儲是指:兩個兒子結點分別用指針指向。而存儲結構值的是:假設該結點在數組中的位置為 i ,則它的左兒子的位置為 2i ,右兒子為 2i + 1. ( i 從1開始)

所以你只要創建一個數組,從鏈式存儲的根節點開始,用中序遍歷遍歷樹,按中序遍歷的順序存儲在數組中。即可完成順序存儲結構的轉化。

相關的遍歷你可以查看相關資料,中序遍歷即訪問順序為左兒子-根-右兒子的順序訪問。

希望對你有所幫助。

❼ C語言鏈表節點逆序問題

首先說你十個字元串輸出結果是九個字元串的問題,你好好看你的for循環代碼,你實際上只能輸入九個字元串的,並不是你提示的那樣能輸入是個字元串,你好好看看i的邊界問題。
然後就是輸出九個字元串都是一樣的問題,你先看你輸入的字元串用的是什麼接收(就是用的什麼變數),九個字元串,你都用的a指針指向的那個空間,問題來了。對於鏈表中的節點,他們自己其實都是獨立的存儲空間,比如第一個節點用的是地址為1的空間,第二個節點用的地址為100的空間,他們都是相互獨立的,而你的代碼,所有節點都是用的a指針指向的那個內存空間。所以實際上你的鏈表只有一個有效節點的,並不是你想的那樣哦。然後你鏈表都是同一個內存空間,而且你輸入也是用的這個空間,對於輸入來說,你重復的用的話,它就是重復的覆蓋而已,你第一個字元串是abc 那麼當第二個字元串輸入時(假設bcd),那麼bcd就會把abc覆蓋掉,這就是為什麼你輸出會是最後一個串輸出九次的原因,不知道懂了沒,這個要有點點計算機內存的知識。。。

❽ 二叉樹的鏈式存儲結構的數據結構定義、創建、先序和後序遍歷,並將結果序列輸出。

1、建立一個單鏈表,並從屏幕顯示單鏈表元素列表。

2、從鍵盤輸入一個數,查找在以上創建的單鏈表中是否存在該數;如果存在,顯示它的位置;如果不存在,給出相應提示。

3、在上述的單鏈表中的指定位置插入指定的元素

4、刪除上述單鏈表中指定位置的元素。

源程序:頭文件

#include<iostream.h>
#include<malloc.h>
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList;

void about(){ //版本信息
cout<<"單鏈表的操作"
}

void showmenu(){ //功能列表
cout<<endl <<" **********功能**********"<<endl
<<" * 1.輸出單鏈表的全部數據*"<<endl
<<" * 2.查找鏈表元素 *"<<endl
<<" * 3.鏈表插入元素 *"<<endl
<<" * 4.鏈表刪除元素 *"<<endl
<<" * 5.結束 *"<<endl
<<" ************************"<<endl
<<"請輸入所需功能: ";
}

//*******查看輸入的全部數據*********
void PrintList(LinkList L){
LinkList p;
cout<<endl<<"你輸入的數據為: ";
p=L->next; //從頭結點開始掃描
while(p){ //順指針向後掃描,直到p->next為NULL或i=j為止
cout<<p->data;
p=p->next; }
cout<<endl; }

//逆序輸入 n 個數據元素,建立帶頭結點的單鏈表
void CreateList_L(LinkList &L, int n) {
int i;
LinkList p;
L = new LNode;
L->next = NULL; // 先建立一個帶頭結點的單鏈表
cout<<"逆序輸入 n 個數據元素,建立帶頭結點的單鏈表"<<endl;
for (i = n; i > 0; --i) {
p = new LNode;
cin>>p->data; // 輸入元素值
p->next = L->next; L->next = p; // 插入
}
}

// L是帶頭結點的鏈表的頭指針,以 e 返回第 i 個元素
Status GetElem_L(LinkList L, int i, ElemType &e) {
int j;
LinkList p;
p = L->next; j = 1; // p指向第一個結點,j為計數器
while (p && j<i) { p = p->next; ++j; } // 順指針向後查找,直到 p 指向第 i 個元素或 p 為空
if ( !p || j>i )
return ERROR; // 第 i 個元素不存在
e = p->data; // 取得第 i 個元素
return OK;
}

// 本演算法在鏈表中第i 個結點之前插入新的元素 e
Status ListInsert_L(LinkList L, int i, ElemType e) {
int j;
LinkList p,s;
p = L; j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 尋找第 i-1 個結點
if (!p || j > i-1)
return ERROR; // i 大於表長或者小於1
s = new LNode; // 生成新結點
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; p->next = s; // 插入
return OK;
}

Status ListDelete_L(LinkList L, int i, ElemType &e)
{LinkList p,q;
int j;
p = L; j = 0;
while (p->next && j < i-1) { p = p->next; ++j; }
// 尋找第 i 個結點,並令 p 指向其前趨

if (!(p->next) || j > i-1)
return ERROR; // 刪除位置不合理
q = p->next; p->next = q->next; // 刪除並釋放結點
e = q->data; free(q);
return OK;
}

#include"LinkList.h"
void main()
{LinkList L;
int n,choice,i;
ElemType e;
about();
cout<<"請輸入鏈表中元素的個數";
cin>>n;
CreateList_L(L, n);
showmenu(); //功能列表
cin>>choice;
while(choice!=5)
{ //輸入時候退出程序
switch(choice){
case 1:PrintList(L);break; //1.查看輸入的全部數據
case 2:{
cout<<"輸入你要查找的元素的位置: ";
cin>>i;GetElem_L(L, i, e);
cout<<"第"<<i<<"個元素的值是"<<e<<endl;
break;} //2.查找鏈表元素
case 3:
{cout<<"請輸入你要插入元素的位置i: ";
cin>>i;
cout<<endl<<"請輸入你要插入元素的值: ";
cin>>e;
ListInsert_L(L, i,e);
break;} //3.鏈表插入元素
case 4:
{cout<<"請輸入你要刪除元素的位置";
cin>>i;
ListDelete_L(L, i, e) ;
break;} //4.鏈表刪除元素
default:cout<<"輸入錯誤,請輸入-5,輸入重顯示功能表^_^ "<<endl;
}
cout<<endl<<"輸入功能序號:";
cin>>choice;
}

}