本文目錄一覽:
C語言順序表的基本操作
#include stdio.h
#include stdlib.h
typedef int DataType; // 定義數據數據類型
typedef struct {
DataType *data; // data指向數據區的首個數據
int length; // 數據長度
}SqList;
void Sort(SqList *L) {
int i,j,k;
DataType tmp;
for(i = 0; i L-length – 1; ++i) {
k = i;
for(j = i + 1; j L-length; ++j)
if(L-data[k] L-data[j])
k = j;
if(k != i) {
tmp = L-data[k];
L-data[k] = L-data[i];
L-data[i] = tmp;
}
}
}
SqList *CreateList(DataType a[],int n) {
int i;
SqList *L;
L = (SqList *)malloc(sizeof(SqList));
L-data = (DataType *)malloc(n * sizeof(DataType));
L-length = n;
for(i = 0; i n; ++i) L-data[i] = a[i];
Sort(L);
return L;
}
int InsertList(SqList *L,DataType x) {
int i,j;
for (i = 0;i L-length;i++) {
if(x = L-data[i]) {
for(j = L-length;j = i;j–)
L-data[j + 1] = L-data[j]; // 結點後移
L-data[i] = x;
L-length++;
return 1;
}
}
L-data[L-length++] = x;
return 1;
}
int RemoveListElem(SqList *L,DataType d) {
int i,j;
for(i = 0; i L-length; ++i) {
if(L-data[i] == d) {
for(j = i; j L-length – 1; ++j)
L-data[j] = L-data[j + 1];
L-length–;
return 1;
}
}
return 0;
}
SqList *AndList(SqList *A, SqList *B) { /* A∩B */
int i,j,k = 0;
int len = (A-length B-length) ? B-length : A-length;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = len;
C-data = (DataType *)malloc(len * sizeof(DataType));
for(i = 0; i A-length; ++i) {
for(j = 0; j B-length; ++j) {
if(A-data[i] == B-data[j]) {
C-data[k++] = A-data[i];
break;
}
}
}
C-length = k;
return C;
}
SqList *OrList(SqList *A, SqList *B) { /* A∪B */
int i,j,flag;
DataType e;
SqList *C = (SqList *)malloc(sizeof(SqList));
C-length = A-length + B-length;
C-data = (DataType *)malloc(C-length * sizeof(DataType));
for(i = 0; i A-length; ++i) C-data[i] = A-data[i];
for(i = 0; i B-length; ++i) {
e = B-data[i];
flag = 1;
for(j = 0; j C-length; ++j) {
if(e == C-data[j]) {
flag = 0;
break;
}
}
if(flag) InsertList(C,e);
}
return C;
}
void PrintList(SqList *L) {
int i;
for(i = 0; i L-length; ++i)
printf(“%d “,L-data[i]);
printf(“\n”);
}
void FreeList(SqList *L) {
free(L-data);
free(L);
}
void main() {
DataType x;
DataType arra[] = {36,24,31,5,90,65,70,39,37};
DataType arrb[] = {9,8,43,51,37,89,33,46,29,80,56};
int alen = sizeof(arra)/sizeof(arra[0]);
int blen = sizeof(arrb)/sizeof(arrb[0]);
SqList *A = CreateList(arra,alen);
printf(“A線性表為: “);
PrintList(A);
SqList *B = CreateList(arrb,blen);
printf(“B線性表為: “);
PrintList(B);
SqList *C = AndList(A,B);
SqList *D = OrList(A,B);
printf(” C = A∩B: “);
PrintList(C);
printf(” D = A∪B: “);
PrintList(D);
printf(“在D表中插入數據 : “);
scanf(“%d”,x);
InsertList(D,x);
printf(“D表插入x後 :”);
PrintList(D);
printf(“刪除D表中數據 : “);
scanf(“%d”,x);
RemoveListElem(D,x);
printf(“刪除x後的D表為 :”);
PrintList(D);
FreeList(A);
FreeList(B);
FreeList(C);
FreeList(D);
}
使用C語言編寫程序,實現順序表的基本運算——插入和刪除。
typedef struct
{
int *elem;
int length;
int listsize;
} Sqlist;
status Create_sq(Sqlist *L,int n)
{
int i;
L-elem=(int*)malloc(100*sizeof(int));
if(!L-elem) return 0;
for(i=0;in;i++)
scanf(“%d”,(L-elem[i]));
L-length=n;
L-listsize=100;
return 1;
}
status Listinsert_sq(Sqlist *L,int i,int e)
{
int *q,*p,*newbase;
if(i1||iL-length+1) return 0;
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;
}
q=(L-elem[i-1]);
for(p=(L-elem[L-length-1]);p=q;–p)
*(p+1)=*p;
*q=e;
++L-length;
return 1;
}
int main()
{
Sqlist L1;
int n,a;
int i,e;
printf(“\n please input the number of data:\n”);
scanf(“%d”,n);
if(Create_sq(L1,n)==1)
{
scanf(“%d%d”,i,e);
a=Listinsert_sq(L1,i,e);
if(a==1)
printf(“insert success\n”);
else printf(“insert false\n”);
printf(“the list elements are:\n”);
for(i=1;i=L1.length;i++)
{
printf(“%d\t”,L1.elem[i-1]);
}
}
return 0;
}
順序表和鏈表的基本操作,用C語言實現!
順序存儲的線性表的算法
#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); }
//順序表的主函數部分
//#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);
}
/*單向鏈表的有關操作示例*/
/*類型定義及頭文件部分,文件名為sllink.h*/
#include stdio.h
#include stdlib.h
typedef int ElemType;//元素實際類型
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //定義結點、指針類型名
//頭插法建立無序鏈表
void CreateList(LinkList L){
LinkList p;
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
printf(“頭插法建立鏈表,以0結束\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結點後插入*s結點*/
p-next=s;
}
/*建立遞增有序的單向鏈表*/
void Create_Sort(LinkList L){
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
printf(“建立有序表,輸入任意個整型數據以0結束\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;
}
/*主函數部分,文件名為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 退出,請輸入選項(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(“輸入選項錯誤,請重新輸入!\n”);
}
}while(select);
}
這些內容不知道能不能幫助到你。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/207238.html