順序存儲的線性表的算法
桐廬網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
#include "stdio.h"
#include "stdlib.h"
#define Status int
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 100
typedef int ElemType;
typedef struct list
{ElemType elem[MAXSIZE];
int length;
}SqList;
void InitList(SqList L){
L.length=0;
}
/*建立順序表*/
void CreateList(SqList L)
{
int i;
printf("input the length");
scanf("%d",L.length);//輸入表長
for(i=1;i=L.length;i++)
scanf("%d",L.elem[i-1]);//輸入元素
}
//順序表的遍歷
void printdata(ElemType e){
printf("%4d",e);
}
void Traverse(SqList L,void (*visit)(ElemType e))
{ int i;
printf("The elements of the lists are:\n");
for(i=1;i=L.length;i++){
if (i%10==0)printf("\n");//每行顯示10個元素
visit(L.elem[i-1]);//輸出表中元素
}
printf("\n");
}
//有序順序表L中插入元素e使序列仍有序
void Insert(SqList L,ElemType e)
{int i,j;
if (L.length==MAXSIZE)exit(OVERFLOW);//表滿,不能插入
for(i=1;i=L.lengthL.elem[i-1]=e;i++);//向后查找
for(j=L.length;j=i;j--)
L.elem[j]=L.elem[j-1];//元素后移
L.elem[i-1]=e;//插入e
L.length=L.length+1;//表長加1
}
//建立遞增有序的順序表
void CreateList_Sorted(SqList L)
{int i,num;
ElemType e;
L.length=0;
printf("Create a sorted list,Input the length of the list\n");
scanf("%d",num);
printf("Input the data %d numbers\n",num);
for(i=1;i=num;i++){
scanf("%d",e);
Insert(L,e);
}
}
/*Merge two sorted lists*/
void MergeList(SqList La,SqList Lb,SqList Lc)
{int *pa,*pb,*pc;
if (La.length+Lb.lengthMAXSIZE) exit(OVERFLOW);
else
{pa=La.elem;pb=Lb.elem;pc=Lc.elem;
while (paLa.elem+La.lengthpbLb.elem+Lb.length)
*pc++=(*pa=*pb)?*pa++:*pb++;/*公共部分合并*/
while (paLa.elem+La.length) *pc++=*pa++;
/*R1表的剩余部分放到R的后部*/
while (pbLb.elem+Lb.length) *pc++=*pb++;
/*R2表的剩余部分放到R的后部*/
Lc.length=La.length+Lb.length;/*R表長*/
}
}
//判斷元素是否對稱,對稱返回TRUE 否則返回FALSE
Status Symmetric(SqList L)
{int low,high;
low=0;
high=L.length-1;
while(lowhigh)
if (L.elem[low]==L.elem[high]){low++;high--;}
else return(FALSE); return(TRUE); }
//順序表的主函數(shù)部分
//#include "seqlist.h"
void main()
{SqList L1,L2,L;
int select;
ElemType e;
do{printf("\n1 insert 2 merge");
printf("\n3 symmetric 0 exit \n");
printf("Please select(0--3)\n");
scanf("%d",select);
switch(select){
case 1:
InitList(L);
CreateList_Sorted(L);
Traverse(L,printdata);
printf("\nInput the element of inserted\n");
scanf("%d",e);
Insert(L,e);
Traverse(L,printdata);
break;
case 2:
InitList(L1);
CreateList_Sorted(L1);
Traverse(L1,printdata);
InitList(L2);
CreateList_Sorted(L2);
Traverse(L2,printdata);
InitList(L);
MergeList(L1,L2,L);
Traverse(L,printdata);
break;
case 3:
InitList(L);
CreateList(L);
Traverse(L,printdata);
if (Symmetric(L)) printf("Yes!\n"); else printf("Not\n");
break;
case 0:break;
default:printf("Error! Try again!\n");
}
}while(select);
}
/*單向鏈表的有關(guān)操作示例*/
/*類型定義及頭文件部分,文件名為sllink.h*/
#include stdio.h
#include stdlib.h
typedef int ElemType;//元素實(shí)際類型
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //定義結(jié)點(diǎn)、指針類型名
//頭插法建立無序鏈表
void CreateList(LinkList L){
LinkList p;
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
printf("頭插法建立鏈表,以0結(jié)束\n");
scanf("%d",e);
while(e){
p=(LinkList)malloc(sizeof(LNode));
p-data=e;
p-next=L-next;
L-next=p;
scanf("%d",e);
}
}
/*非遞減有序單向鏈表L插入元素e序列仍有序*/
void Insert_Sort(LinkList L,ElemType e){
LinkList p,s;
s=(LinkList)malloc(sizeof(LNode));
s-data=e;
p=L;
while(p-nextp-next-data=e)
p=p-next;/*查找插入位置*/
s-next=p-next; /*插入語句*p結(jié)點(diǎn)后插入*s結(jié)點(diǎn)*/
p-next=s;
}
/*建立遞增有序的單向鏈表*/
void Create_Sort(LinkList L){
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
printf("建立有序表,輸入任意個整型數(shù)據(jù)以0結(jié)束\n");
scanf("%d",e);
while(e){
Insert_Sort(L,e);
scanf("%d",e);
}
}
/*單向鏈表的遍歷*/
void Traverse(LinkList L){
LinkList p;
printf("遍歷鏈表");
for(p=L-next;p;p=p-next)
printf("%5d",p-data);
printf("\n");
}
/*在單向鏈表刪除元素e*/
void Delete(LinkList L,ElemType e){
LinkList p,q;
p=L;
q=L-next;
while(q q-data!=e){//查找元素的刪除位置
p=q;
q=q-next;
}
if(!q) printf("\nnot deleted");/*未找到元素e*/
else {p-next=q-next;/*找到刪除*/
free(q);}
}
/*單向鏈表的逆置*/
void exch(LinkList L){
LinkList p,s;
p=L-next;
L-next=NULL;
while(p){
s=p;
p=p-next;
s-next=L-next;
L-next=s;
}
}
/*兩個非遞減有序單向鏈表合并后仍為非遞減序列*/
void MergeIncrease(LinkList La,LinkList Lb,LinkList Lc){
LinkList p,q,s,rear;
p=La-next;
q=Lb-next;
Lc=rear=La;
free(Lb);
while(pq){
if (p-dataq-data) {s=p;p=p-next; }
else {s=q;q=q-next; }
rear-next=s;/*較小元素插入表尾*/
rear=rear-next;
}
if (p) rear-next=p; else rear-next=q;
}
/*主函數(shù)部分,文件名為sllink.c*/
//#include "sllink.h"
void main(){
LinkList La,Lb,Lc;
ElemType e;
int select;
do{
printf(" 1 建立無序表,再刪除指定元素\n");
printf(" 2 建立遞增有序表,再逆置\n");
printf(" 3 建立兩個遞增有序表,將它們和并為一個仍遞增表\n");
printf(" 0 退出,請輸入選項(xiàng)(0-3)\n");
scanf("%d",select);
switch(select){
case 0:
break;
case 1:
CreateList(La);
Traverse(La);
printf("輸入需刪除的元素\n");
scanf("%d",e);
Delete(La,e);
Traverse(La);
break;
case 2:
Create_Sort(La);
Traverse(La);
exch(La);
printf("The list that is exchaged\n");
Traverse(La);
break;
case 3:
Create_Sort(La);Traverse(La);
Create_Sort(Lb);Traverse(Lb);
MergeIncrease(La,Lb,Lc);Traverse(Lc);
break;
default:
printf("輸入選項(xiàng)錯誤,請重新輸入!\n");
}
}while(select);
}
這些內(nèi)容不知道能不能幫助到你。
樓主你好
修改如下:
#includestdio.h
#includemalloc.h
#define MaxSize 40 //順序表存儲空間的初始分配量 -- (1)可以將MaxSize調(diào)大點(diǎn)兒
typedef struct
{
int *p;
int data[MaxSize];
int length;
int listsize;
}SeqList;
void InitList(SeqList x) //定義順序表的初始化函數(shù)
//-- (2)這里應(yīng)該是SeqList x 需要址傳遞 值傳遞是不會改變實(shí)參值的
{
x.p=(int*)malloc(MaxSize*sizeof(int));
if(!x.p) printf("存儲分配失??!");
x.length=0;
x.listsize=MaxSize;
}
int main()
{
SeqList L;
InitList(L);
int i,n,k;
printf("請輸入順序表的長度n:");
scanf("%d",n);
if(n=0)
{
printf("數(shù)據(jù)錯誤!\n");
return 0;
}
if(nMaxSize)
{
L.p=(int*)realloc(L.p,n*sizeof(int));
if(!L.p)printf("存儲空間擴(kuò)展失?。n");
L.listsize=n;
}
printf("請輸入數(shù)據(jù):");
for(i=0;i=n-1;i++)
{
scanf("%d",k);
L.data[i]=k;
L.length++;
}
printf("線性表為:");
for(i=0;i=n-1;i++)
printf("%d ",L.data[i]);
printf("\n");
return 1;
}
請看注釋(1)(2)
希望能幫助你哈^_^
#include?stdio.h
#include?stdlib.h
#define?TRUE?1
#define?FALSE?0
#define?OK?1
#define?ERROR?0
#define?INFEASIBLE?-1
#define?OVERFLOW?-2
#define?LIST_INIT_SIZE?100
#define?LISTINCREMENT??10
typedef?int?Status;
typedef?int?ElemType;
typedef?struct?{
ElemType?*elem;
size_t?length;
size_t?maxsize;
// int?data;
}SqList;
//對表初始化?
SqList?*InitList()?{
SqList?*L?=?(SqList?*)malloc(sizeof(SqList));
L-elem?=?(ElemType?*)malloc(LIST_INIT_SIZE?*?sizeof(ElemType));
if(!?L-elem)??exit(OVERFLOW);?????//分配空間失敗
L-length?=?0;?????????????????????//空表長度為0
L-maxsize?=?LIST_INIT_SIZE;??????//初始存儲容量
return?L;
}//InitList_Sq
//建立新表?
void?Buid(SqList?*L)?{
ElemType?*newbase,data;
printf("輸入元素:");
scanf("%d",data);
if(L-length?=?L-maxsize)?{?//存儲空間已滿,增加分配
newbase?=?(ElemType?*)realloc(L-elem,(L-maxsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)?exit(OVERFLOW);//存儲分配失敗
free(L-elem);
L-elem?=?newbase;???????//新基址
L-maxsize?+=?LISTINCREMENT;?//增加存儲容量
}
L-elem[L-length]?=?data;
++L-length;
}
//輸出表
void??output(SqList?*L)?{
size_t?i;
for(i?=?0;?i??L-length;?i++)
printf("%d?",L-elem[i]);
printf("\n");
}
//主函數(shù)?
int?main()?{
SqList?*L?=?InitList();
Buid(L);
output(L);
return?0;
}
建立方法很多,線性表是順序表的順序存儲結(jié)構(gòu),這里我給你寫個簡單的例子參考一下,只要理解了,怎么寫都不會錯:具體代碼如下: #include typedef struct{ int data[100]; int length; }Seqlist;//定義Seq這個新的數(shù)據(jù)類型 void creat(Seqlist L);//建立線性表 void show(Seqlist L);//顯示線性表 int main() { Seqlist L; L.length=0;//初始化線性表的長度為0 creat(L); show(L); return 0; } void creat(Seqlist L) { int a; printf("請輸入要創(chuàng)建的元素的個數(shù):\t"); scanf("%d",a); for(int i=0;i
#include?stdio.h
#include?string.h
#include?stdlib.h
#define?maxsize?100
typedef?char?elepmtype;
typedef?struct?sequlist
{
elepmtype?data[maxsize];
int?num;
//int?length;???//和num的功能不是一樣的么
}SeqList,*LinkList;
void?ListInitiate(LinkList?*L)??//利用二級指針,初始化順序表,你這里是想模仿我的那個二級指針方法嗎?
{?
(*L)=(LinkList)malloc(sizeof(SeqList));
(*L)-num=0;???????????????????//初始化為0
}?
void?InputSeqList(SeqList?*L)???//跟人家借一個輸入函數(shù)
{
char?str[maxsize];?????
printf("輸入字符串:");
gets(str);?????????
for(int?i=0;str[i]!='\0';i++){???//這個地方用'\0'字符就好了,因?yàn)樽址麛?shù)組或者字符串的結(jié)束符都是\0
L-data[i]=str[i];
L-num++;
}
}
int?InsertList(?SeqList?*L,int?i,elepmtype?x)/*i取值從0到maxsize-1*/
{?
int?j;
if(i0||iL-num+1)
{?printf("error\n");return(0);}/*檢查插入位置的合理性*/
if((L-num==maxsize-1))/*表滿則不能插入*/?
{printf("插入位置錯\n");return(0);}
for(j=L-num;j=i;j--)/*結(jié)點(diǎn)后移,為插入騰出空間*/
L-data[j+1]=L-data[j];?????????????//這里應(yīng)該是L-data??不是?List,而且向后移動數(shù)據(jù)的話
L-data[i]=x;???????//新元素插入
L-num++;??????/*調(diào)整last指向最后元素*/
return(1);/*成功返回1*/
}
//刪除函數(shù)
int?ListDelete(SeqList?*L,int?i,??elepmtype?*x)???//這是不是分號?是逗號
{?
int?j;
if(L-num0)
{
printf("\n?the?list?is?empty!");
return?0;??????????
}
else?if?(i0||iL-num)??????//掉了一個
{?
printf("\n?the?position?is?invialid");
return?0;
}
else?
{
*x=L-data[i];????????????????//這里記錄了x的值
for?(j=i+1;j=L-num;j++){
L-data[j-1]=L-data[j];?????????//改成這樣看著比較舒服
}
L-num--;
}
return?1;
}
int?ListLength(SeqList?*L)?????//這里怎么多了一個分號
{
return?L-num;
//int?i;
//i=0;
//for(i=0;i=n;i++)
//return(i);????//return只會執(zhí)行一次。
}
void?OutputSeqList(SeqList?*L)?
{
if(0==L-num)????//你定義的是num啊,怎么又寫成了last,代碼亂入啊
return;
for(int?i?=?0;i?L-num;i++){
printf("%c",L-data[i]);?
}
printf("\n");?
printf("字符串有%d個字符\n",ListLength(L));?//你的函數(shù)的名字是ListLength,不是length
}
int?main()
{
SeqList?*sq;
ListInitiate(sq);??//將sq指針的地址傳給了SeqList?**?L,進(jìn)行初始化,充當(dāng)了一個全局變量的作用
//InitList(sq);
InputSeqList(sq);
OutputSeqList(sq);
//InsertSeqList(sq,1,'a');
InsertList(sq,1,'a');
OutputSeqList(sq);
//DelSeqList(sq,2);
char?c;
ListDelete(sq,2,c);
OutputSeqList(sq);
printf("%c成功被刪除\n",c);
system("PAUSE");
return?0;
}不懂的直接加Q,Q已給你私信