c語言數據結構線性表
⑴ c語言常見的數據結構有哪些
1、線性數據結構
元素之間一般存在元素之間存在一對一關系,是最常用的一類數據結構,典型的有:數組、棧、隊列和線性表。
2、樹形結構
結點間具有層次關系,每一層的一個結點能且只能和上一層的一個結點相關,但同時可以和下一層的多個結點相關,稱為“一對多”關系,常見類型有:樹、堆。
3、圖形結構
在圖形結構中,允許多個結點之間相關,稱為“多對多”關系。
(1)線性數據結構:元素之間一般存在元素之間存在一對一關系,是最常用的一類數據結構,典型的有:數組、棧、隊列和線性表
(2)樹形結構:結點間具有層次關系,每一層的一個結點能且只能和上一層的一個結點相關,但同時可以和下一層的多個結點相關,稱為“一對多”關系,常見類型有:樹、堆
(3)圖形結構:在圖形結構中,允許多個結點之間相關,稱為“多對多”關系
⑵ 計算機c語言中什麼是數據的線性結構和非線性結構
一、線性結構是一個有序數據元素的集合。 其中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其它數據元素都是首尾相接的。常用的線性結構有:線性表,棧,隊列,雙隊列,數組,串。
二、非線性結構中各個數據元素不再保持在一個線性序列中者答鏈,每個數據元素可能與零個或者多個其他數據元素發生聯系。根據關系的不同,可分為層次結構和群結構。
1、層次結構是舉團按層次劃分的數據元素的集合,指定層次上元素可以是零個或多個處於下一首孫個層次上的直接所屬下層元素。最典型的層次結構即為樹形結構,比如Linux文件系統即為樹形結構。
2、群結構中所有的元素之間無順序關系,最典型的群結構是集合和圖。
⑶ 【100分】數據結構——使用C語言(線性表)
//c++的頭文件,我是用c++編寫的,有一些該成了C但是有些輸入輸出沒有改
//希望樓主不要建議哦,費了很久的時間寫的啊!
#include<iostream>//c++的頭文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define error 0
#define OVERFLOW 1
#define OK 1
using namespace std;//c++的一個指令
typedef struct
{
int *elem; //存儲空間基址
int length; //當前長度
int listsize;//當前分配的存儲容量
// (以sizeof(ElemType)為單位)
//int *next;
}sqlist;
void initList(sqlist &La)
{//構造一個空線性表L
La.elem=(int *) malloc(100 *sizeof(int));//分配空間
if (!La.elem) exit(-2);//未分配則 跳出;
La.length=0;
La.listsize= 100 ;
}
int Listinsert_sq(sqlist &L,int i,int e) // listinsert_sq;插入一個元素
{int *newbase;int *p,*q;
if (i<1 || i>L.length+1) return error;
if (L.length>=L.listsize)//空間不足追加
{newbase=(int*) realloc(L.elem,(L.listsize+10) *sizeof(int));
if (!newbase)
exit(-2);
L.elem=newbase; L.listsize+=10 ;
return 0;
}
q=&(L.elem[i-1]);//指針指向確定插入的位子
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//指針後移
*q=e; //實現元素的插入
++L.length;
return 0;
}
int ListDelete_sq(sqlist &L,int i)//刪除i位子的元素
{int *p,*q;
if((i<1)||(i>L.length)) return 0;
p=&(L.elem[i-1]);
//e=*p;
cout<<"被刪除的值是:"<<*p<<endl;
for(q=&(L.elem[L.length-1]);p<q;p++)
*p =*(p+1);//指針前移,覆蓋前面的存儲的數據
--L.length;
return 1;
}
int Getelem(sqlist &L)//輸入表的數據
{ int n;
cout<<"輸入數列的個數:"<<endl;
cin>>n;
printf("按大小順序輸入n個數:");//cout<<"按大小順序輸入n個數:";
if(n<0||n>L.listsize ) return 0;
for(int i=0;i<n;i++)//循環輸入元素
{ cin>>L.elem [i];
L.length ++;//表長度
}
cout<<"這數列的長度:"<<L.length <<endl;
return 1;
}
int Poplist(sqlist &L)//輸出函數
{
for(int j=0;j<L.length ;j++)
cout<<L.elem[j]<<" ";
printf("\n");//cout<<endl;
return 0;
}
void ListMerge(sqlist La,sqlist Lb, sqlist &Lc)//合並函數,
{ int *pa,*pb,*pa_list ,*pb_list,*pc;
pa=La.elem;pb=Lb.elem;//用pa和pb指向表頭
Lc.length=La.length+Lb.length;
Lc.listsize=Lc.length;
Lc.elem=(int *)malloc(Lc.listsize*sizeof(int ));//合理分配Lc的空間
if(!Lc.elem) exit(-2);
pa_list=&(La.elem[La.length-1]);pb_list=&(Lb.elem[Lb.length-1]);//用pa-list和pb_list指向表未
pc=Lc.elem;
while(pa<=pa_list&&pb<=pb_list)//合並演算法
{ if(*pa>=*pb){ *pc++=*pb++;*pc++=*pa++;}
//if(*pa=*pb){ *pc++=*pa++;*pc++=*pb++; }
else {*pc++=*pa++;*pc++=*pb++;}
}
while(pa<=pa_list) *pc++=*pa++;//插入剩餘的元素;
while(pb<=pb_list) *pc++=*pb++;
}
int main()
{ sqlist La,Lb,Lc;int i,e;
initList(La);
Getelem(La);
initList(Lb);
Getelem(Lb);
ListMerge(La,Lb,Lc);
Poplist(Lc);
printf("input munber 要刪除的位子i \n:");
scanf("%d",&i);// cin>>i;
ListDelete_sq(La,i);
Poplist(La);//我這里是用表La做例子。也可用Lb。。。
printf("輸出要插入的位子和元素:\n");
scanf("%d%d",&i,&e);//cin>>i>>e;
Listinsert_sq(Lb,i,e);
Poplist(Lb);//我這里是用表Lb做例子。也可用La。。。
return 0;
}
終於全搞定了,還有些不足,希望對樓主有用!