❶ 已知長度為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;
}
}