當前位置:首頁 » 編程語言 » c語言線性表基本操作

c語言線性表基本操作

發布時間: 2022-09-08 06:35:33

㈠ 線性表的操作(c語言

//---------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define STY "%d"/*元素類型格式符*/
typedef int eltp;/*元素類型*/

typedef struct node{
eltp data;
struct node *next;
} node;

void init(void)
{
static int fg=1;
if (fg) {
srand(time(NULL));
fg=0;
}
}
node *insert(node *h,eltp d)
{
node *s=(node *)malloc(sizeof(node));
if (!h) {
s->data=d;
s->next=NULL;
h=s;
}
else {
h->next=insert(h->next,d);
}
return h;
}
node *create(int n)
{
node *h=NULL;
int i;
for (i = 0; i<n; i++) {
h=insert(h,rand()%100);
}
if (h) {
printf("線性表生成已完成!\n");
}
else {
fprintf(stderr,"線性表生成未成功\n");
exit(-1);
}
return h;
}
node *del(node *h,eltp d)
{
node *p;
if (h&&h->data==d) {
p=h;
h=h->next;
free(p);
}
else if (h) h->next=del(h->next,d);

return h;
}
int search(node *h,eltp d)
{
int i=1;
while (h&&h->data!=d)
{
h=h->next;
i++;
}
if (!h) i=-1;
return i;
}

int count(node *h)
{
int i=0;
for (i = 0; h; i++) {
h=h->next;
}
return i;
}

void prt(node *h)
{
while (h)
{
printf(STY"\t",h->data);
h=h->next;
}
putchar('\n');
}
void Free(node **h)
{
if (*h) {
Free(&(*h)->next);
free(*h);
*h=NULL;
}
}
int menu(void)
{
int i;
puts("******************");
puts("1.生成線性表");
puts("2.輸出表元素");
puts("3.刪除表元素");
puts("4.查找表元素");
puts("5.統計表元素");
puts("6.插入表元素");
puts("7.刪除線性表");
puts("0.退出本程序");
puts("******************");
printf("請選擇:");
scanf("%d",&i);
return i;
}
void find(node *h)
{
eltp a;
//node *t=NULL;
int index;
printf("請輸入要查找的數字:");
scanf(STY,&a);
index=search(h,a);
if (index!=-1) {
printf(STY"是表中的第%d個元素\n",a,index);
}
else printf(STY"不是表中的元素\n",a);
}
node *insert_node(node *h,int index,eltp a)
{
node *hd=h,*in=(node *)malloc(sizeof(node));
int i;
in->data=a;
if (index>1) {
for (i=1; h->next&&i<index-1; i++) {
h=h->next;
}
in->next=h->next;
h->next=in;
}
else {
in->next=hd;
hd=in;
}
return hd;
}
node *remove_node(node *h)
{
eltp a;
printf("請輸入要刪除的元素:");
scanf(STY,&a);
h=del(h,a);
puts("已完成");
return h;
}
node *ins(node *h)
{
eltp a;
int i;
printf("請輸入要插入的元素:");
scanf(STY,&a);
printf("請輸入要插入的位置:");
scanf("%d",&i);
return insert_node(h,i,a);
}
int main(void)
{
node *head=NULL;
int ch;
init();
do
{
ch=menu();
switch (ch) {

default:printf("輸入有誤,重新輸入\n");break;
case 0:break;
case 1:if(head) Free(&head);
head=create(10);
break;
case 2:prt(head);break;
case 3:head=remove_node(head);break;
case 4:find(head);break;
case 5:printf("表中共有%d個元素\n",count(head));break;
case 6:head=ins(head);break;
case 7:Free(&head);break;

}
}while (ch);
Free(&head);
return 0;
}
//---------------------------------------------------------------------------

㈡ 線性表的基本操作c語言實現

代碼如下:

頭文件:

2_1.h

#ifndef _2_1_H

#define _2_1_H

typedef void SeqList;

typedef void SeqListNode;

//創建線性表

SeqList * SeqList_Create(int capacity);

//銷毀線性表

void SeqList_DesTroy(SeqList * list);

void SeqList_Clear(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

SeqListNode* SeqList_Get(SeqList* list, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

#endif

源文件:

// 順序線性表.cpp : 定義控制台應用程序的入口點。

//

#include "stdafx.h"

#include <malloc.h>

#include <stdlib.h>

#include "2_1.h"

typedef unsigned int TSeqListNode;

typedef struct {

int len; //長度

int capacity;//總長度

TSeqListNode * node;//每個節點的指針

} TSeqList;

int main()

{

SeqList* list = SeqList_Create(5);//創建線性表

int i = 6;//賦值6個變數,已超過線性表最大值 5

int j = 1;

int k = 2;

int x = 3;

int y = 4;

int z = 5;

int index = 0;

SeqList_Insert(list, &i, 7); //將這6個變數插入線性表中

SeqList_Insert(list, &j, 0);

SeqList_Insert(list, &k, 0);

SeqList_Insert(list, &x, 0);

SeqList_Insert(list, &y, 0);

SeqList_Insert(list, &z, 0);

//遍歷

for(index=0; index<SeqList_Length(list); index++)

{

int* p = (int*)SeqList_Get(list, index);

printf("%d ", *p);

}

printf(" ");

//刪除操作

while( SeqList_Length(list) > 0 )

{

int* p = (int*)SeqList_Delete(list, 0);

printf("刪除了: %d ", *p);

}

SeqList_Clear(list);

SeqList_DesTroy(list);

system("pause");

return 0;

}

//創建線性表

SeqList * SeqList_Create(int capacity)

{

TSeqList* ret = NULL ;

if(capacity >= 0)

{

ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity); //為線性表分配空間,包含結 //構體和節點的總大小

}

if(NULL != ret)

{

ret->len = 0;

ret->capacity = capacity;

ret->node = (TSeqListNode*)(ret + 1);//將節點指向上述分配到的空間的後部分

}

return ret;

}

//銷毀

void SeqList_DesTroy(SeqList * list)

{

free(list);

}

//清空

void SeqList_Clear(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

if(NULL != ret)

{

ret->len = 0;

}

}

//獲得線性表的長度

int SeqList_Length(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

int len = -1;

if(NULL != ret)

{

len = ret->len;

}

return len;

}

//線性表的總長度

int SeqList_Capacity(SeqList* list)

{

TSeqList * ret = (TSeqList*)list;

int capacity = -1;

if(NULL != ret)

{

ret->capacity = capacity;

}

return capacity;

}

//插入

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)

{

TSeqList * sList = (TSeqList*)list;

int i,ret = -1;

if((sList != NULL) &&(pos >= 0) && sList->capacity >= sList->len+1)

{

if(pos >= sList->len)

{

pos = sList->len;

}

for(i = sList->len; i > pos; i--)

{

sList->node[i] = sList->node[i-1];

}

sList->node[i] = (TSeqListNode)node;

++sList->len;

ret = 1;

}

return ret;

}

//獲得指定位置的節點

SeqListNode* SeqList_Get(SeqList* list, int pos)

{

TSeqList * sList = (TSeqList*)list;

TSeqListNode* node = NULL;

if(NULL != sList && pos>=0 && pos < sList->len)

{

node = (TSeqListNode*)sList->node[pos];

}

return node;

}

//刪除

SeqListNode* SeqList_Delete(SeqList* list, int pos)

{

TSeqList * sList = (TSeqList*)list;

SeqListNode * node = SeqList_Get( list, pos);

int i;

if(sList != NULL && pos >= 0 && pos< sList->len)

{

for( i=pos+1; i<sList->len; i++)

{

sList->node[i-1] = sList->node[i];

}

sList->len--;

}

return node;

}

演示:

資料拓展:

線性表是最基本、最簡單、也是最常用的一種數據結構。

線性表中數據元素之間的關系是一對一的關系,即除了第一個和最後一個數據元素之外,其它數據元素都是首尾相接的(注意,這句話只適用大部分線性表,而不是全部。比如,循環鏈表邏輯層次上也是一種線性表(存儲層次上屬於鏈式存儲),但是把最後一個數據元素的尾指針指向了首位結點)。

我們說「線性」和「非線性」,只在邏輯層次上討論,而不考慮存儲層次,所以雙向鏈表和循環鏈表依舊是線性表。

在數據結構邏輯層次上細分,線性表可分為一般線性表和受限線性表。一般線性表也就是我們通常所說的「線性表」,可以自由的刪除或添加結點。受限線性表主要包括棧和隊列,受限表示對結點的操作受限制。

線性表的邏輯結構簡單,便於實現和操作。因此,線性表這種數據結構在實際應用中是廣泛採用的一種數據結構。

㈢ 誰能給一個簡單的線性表操作C語言完整程序

1、線性表有兩種:

typedefstruct{

ElemType*elem;

intlength;

intlistsize;

}sqlist;//順序表


voidInitList_Sq(SqList&l){

l.elem=newElemType[LIST_INIT_SIZE];

l.length=0;

l.listsize=LIST_INIT_SIZE;

}//初始化順序表

然後SqListLa;

InitList_Sq(La);

就可以


typedefstructLnode{

intdata;

structLnode*next;

}Lnode,*LinkList;//線性鏈表

//單鏈表可以有效的利用主存的碎片,它的數據域不是連續的


2、常式:

#include"stdio.h"
#include<malloc.h>
typedefcharElemType;
typedefstructLNode
{ElemTypedata;
structLNode*next;
}LinkList;
voidCreatListF(LinkList*&L,ElemTypea[],intn)//頭插法建表
{
LinkList*s;inti;
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
voidCreateListR(LinkList*&L,ElemTypea[],intn)//尾插法建表
{
LinkList*s,*r;inti;
L=(LinkList*)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
voidInitList(LinkList*&L)//初始化線性表
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}
voidDestroyList(LinkList*&L)//銷毀線性表
{
LinkList*p=L,*q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
intListEmpty(LinkList*L)//判斷線性表是否為空
{
return(L->next==NULL);
}
intListLength(LinkList*L)//求線性表的長度
{
LinkList*p=L;intn=0;
while(p->next!=NULL)
{
n++;p=p->next;
}
return(n);
}
voidDispList(LinkList*L)//輸出線性表
{
LinkList*p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}
intGetElem(LinkList*L,inti,ElemType&e)//求線性表中某個數據元素值
{
intj=0;
LinkList*p=L;
while(j<i&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
return0;
else
{
e=p->data;return1;
}
}
intLocateElem(LinkList*L,ElemTypee)//按元素值查找
{
LinkList*p=L->next;
inti=1;
while(p!=NULL&&p->data!=e)
{
p=p->next;i++;
}
if(p==NULL)return(0);
elsereturn(i);
}
intListInsert(LinkList*&L,inti,ElemTypee)//插入數據元素
{
intj=0;
LinkList*p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)return0;
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;s->next=p->next;p->next=s;
return1;
}
}
intListDelete(LinkList*&L,inti,ElemType&e)//刪除數據元素
{
intj=0;
LinkList*p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
return0;
else
{
q=p->next;
if(q==NULL)return0;
e=q->data;
p->next=q->next;
free(q);
return1;
}
}
intmain()
{
ElemTypee,a[5]={'a','b','c','d','e'};
LinkList*h;
InitList(h);//初始化順序表h
CreateListR(h,&a[0],5);//依次採用尾插入法插入a,b,c,d,e元素
printf("單鏈表為:");
DispList(h);printf(" ");//輸出順序表h
printf("該單鏈表的長度為:");
printf("%d",ListLength(h));printf(" ");//輸出順序表h的長度
if(ListEmpty(h))printf("該單鏈表為空。 ");
elseprintf("該單鏈表不為空。 ");//判斷順序表h是否為空
GetElem(h,3,e);printf("該單鏈表的第3個元素為:");
printf("%c",e);printf(" ");//輸出順序表h的第3個元素
printf("該單鏈表中a的位置為:");
printf("%d",LocateElem(h,'a'));printf(" ");//輸出元素'a'的位置
ListInsert(h,4,'f');//在第4個元素位置插入'f'素
printf("在第4個元素位置上插入'f'後單鏈表為:");
DispList(h);printf(" ");//輸出順序表h
ListDelete(h,3,e);//刪除L的第3個元素
printf("刪除第3個元素後單鏈表為:");
DispList(h);printf(" ");//輸出順序表h
DestroyList(h);//釋放順序表h
return0;
}

㈣ C語言數據結構線性表單鏈表的基本操作,寫好了代碼,編譯沒有錯但運行有錯,求找錯誤在哪謝謝 #in

VC調試時按Alt+8、Alt+7、Alt+6和Alt+5,打開匯編窗口、堆棧窗口、內存窗口和寄存器窗口看每句C對應的匯編、單步執行並觀察相應堆棧、內存和寄存器變化,這樣過一遍不就啥都明白了嗎。
對VC來說,所謂『調試時』就是編譯連接通過以後,按F10或F11鍵單步執行一步以後的時候,或者在某行按F9設了斷點後按F5執行停在該斷點處的時候。
(Turbo C或Borland C用Turbo Debugger調試,Linux或Unix下用GDB調試時,看每句C對應的匯編並單步執行觀察相應內存和寄存器變化。)

㈤ C語言線性表基本操作求助

#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100
# define OK 1
# define ERROR 0
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}Sqlist;
int CreateList(Sqlist *L)//創建線性表
{
int i, n, num;
printf("請輸入元素個數:");
scanf("%d", &n);
printf("請依次輸入整數值:");
for (i = 1; i <=n; i++)//一共n個元素,=號
{
scanf("%d", &num);
L->data[i] = num;
L->length++;//長度加1
}
return OK;
}

int ListLength(Sqlist* L)//返回線性表長度
{
printf("線性表的長度為:%d", L->length);
return L->length;
}

int PrintList(Sqlist* L)//依次輸出線性表
{
int i;
for (i = 1; i <= L->length; i++)
{
printf("%d\t", L->data[i]);
}
printf("\n");
return OK;
}

int InsertList(Sqlist *L, int i, ElemType e)//插入元素s
{
int k;
if (L->length == MAXSIZE )
return ERROR;
if (i<1 || i>L->length +1 )
return ERROR;
if (i <= L->length)
{
for (k = L->length; k >= i - 1; k--)//k--,下標從1開始則lengh位置已有元素,不應length-1
L->data[k + 1] = L->data[k];
}
L->data[i] = e;//i不減1
L->length++;
return OK;
}

int DeletList(Sqlist *L, int i)//刪除元素
{
int k;
if (L->length == 0)//==
return ERROR;
if (i<1 || i>L->length)
return ERROR;
if (i <= L->length)
{
for (k = i; k < L->length; k++)
L->data[k] = L->data[k+1];//應該這樣
}
L->length--;
return OK;

}

int GetElem(Sqlist* L, int i, ElemType* e)//用e返回線性表中第i個元素的值
{
if (L->length ==0 || i<1 || i>L->length)//==
return ERROR;
*e = L->data[i];//前面下標都是1開始,就不用-1了
return OK;
}

int MergeList(Sqlist* L1, Sqlist* L2, Sqlist *L3)//兩個線性表求並集,結果放在L3里
{
int i, j, k;
i = 1;
j = 1;
k = 1;
while ((i <= L1->length) && (j <= L2->length))
{
if (L1->data[i] == L2->data[j])
{
L3->data[k] = L1->data[i];
i++;
j++;
}
else
if (L1->data[i] < L2->data[j])
{
L3->data[k] = L1->data[i];
i++;
}
else
{
L3->data[k] = L2->data[j];
j++;
}
k++;
}
if (i > L1->length)
for (i = j; i <= L2->length; i++)
{
L3->data[k] = L2->data[i];
k++;
}
else
for (j = i; j <= L1->length; j++)
{
L3->data[k] = L1->data[j];
k++;
}
L3->length = k - 1;
return OK;
}
void menu()
{
printf("\n");
printf(" *******************順序線性表功能菜單*******************\n");
printf(" * 1:建立線性表 2:插入元素 *\n");
printf(" * 3: 刪除元素 4:合並線性表 *\n");
printf(" * 5:列印線性表 6:查找特定元素 *\n");
printf(" * 7:線性表長度 8:退出 *\n");
printf(" ********************************************************\n");
printf(" 請輸入你的選擇:");
}
void main()
{
Sqlist L, L1, L2, L3;
ElemType e;
int i,n,flag;
char a;
L.length = 0;
//int CreateList(Sqlist *L);//函數原型
//int ListLength(Sqlist* L);
//int PrintList(Sqlist* L);
//int InsertList(Sqlist *L, int i, ElemType e);
//int DeletList(Sqlist *L, int i);
//int GetElem(Sqlist* L, int i, ElemType e);
//int MergeList(Sqlist L1, Sqlist L2, Sqlist *L3);
menu();
do
{
scanf("%d",&n);
if(n>=1&&n<=7)
{
flag=1;
break;
}
else
{
flag=0;
printf("您輸入有誤,請重新選擇!");
}
}
while(flag==0);
while(flag==1)
{
switch (n)
{
case 1:
CreateList(&L);
PrintList(&L);
break;
case 2:
printf(" 請輸入要插入的數據元素:");
scanf("%d", &e);
printf(" 請輸入要插入的元素位置:");
scanf("%d", &i);
InsertList(&L, i, e);
break;
case 3:
printf(" 請輸入要刪除的元素位置:");
scanf("%d", &i);
DeletList(&L, i);
PrintList(&L);
break;
case 4:
printf(" 創建第一個順序表");
CreateList(&L1);
printf(" 創建第二個順序表");
CreateList(&L2);
PrintList(&L1);
PrintList(&L2);
MergeList(&L1, &L2, &L3);
PrintList(&L3);
break;
case 5:
PrintList(&L);break;//這里開始都忘了break
case 6:
printf("請輸入查看元素序號:");
scanf("%d", &i);
GetElem(&L, i, &e);
printf("第%d個元素為%d", i, e);break;
case 7:
ListLength(&L);break;
case 8:
exit(0);
break;
default:
break;
}
getchar();
printf("\n");
printf("是否繼續進行(y or n):\n");
scanf("%c",&a);
if(a=='y')
{
flag=1;
system("cls"); /*清屏*/
menu(); /*調用菜單函數*/
printf("請再次選擇你需要操作的步驟(1--7):\n");
scanf("%d",&n);
printf("\n");
}

else
exit(0);

}
}

㈥ 實現線性表或棧或隊列(三選一)的基本操作(用C語言實現)

樓上的兩個代碼都可以用,一個是順序表,一個是鏈表

㈦ 線性表的操作,C語言

#include"stdio.h"
#include<malloc.h>

typedef char ElemType;

typedef struct LNode
{ElemType data;
struct LNode *next;
}LinkList;

void CreatListF(LinkList *&L,ElemType a[],int n) //頭插法建表
{
LinkList *s;int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}

void CreateListR(LinkList *&L,ElemType a[],int n) //尾插法建表
{
LinkList *s,*r;int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}

void InitList(LinkList *&L) //初始化線性表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}

void DestroyList(LinkList *&L) //銷毀線性表
{
LinkList *p=L,*q=p->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}

int ListEmpty(LinkList *L) //判斷線性表是否為空
{
return(L->next==NULL);
}

int ListLength(LinkList *L) //求線性表的長度
{
LinkList *p=L;int n=0;
while(p->next!=NULL)
{
n++;p=p->next;
}
return(n);
}

void DispList(LinkList *L) //輸出線性表
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}

int GetElem(LinkList *L,int i,ElemType &e) //求線性表中某個數據元素值
{
int j=0;
LinkList *p=L;
while(j<i&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
return 0;
else
{
e=p->data;return 1;
}
}

int LocateElem(LinkList *L,ElemType e) //按元素值查找
{
LinkList *p=L->next;
int i=1;
while(p!=NULL&&p->data!=e)
{
p=p->next;i++;
}
if(p==NULL)return(0);
else return(i);
}

int ListInsert(LinkList *&L,int i,ElemType e) //插入數據元素
{
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)return 0;
else
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e; s->next=p->next; p->next=s;
return 1;
}
}

int ListDelete(LinkList *&L,int i,ElemType &e) //刪除數據元素
{
int j=0;
LinkList *p=L,*q;
while(j<i-1&&p!=NULL)
{
j++;p=p->next;
}
if(p==NULL)
return 0;
else
{
q=p->next;
if(q==NULL)return 0;
e=q->data;
p->next=q->next;
free(q);
return 1;
}
}

int main()
{
ElemType e,a[5]={'a','b','c','d','e'};
LinkList *h;

InitList(h); //初始化順序表h
CreateListR(h,&a[0],5); //依次採用尾插入法插入a,b,c,d,e元素
printf("單鏈表為:");
DispList(h); printf("\n"); //輸出順序表h

printf("該單鏈表的長度為:");
printf("%d",ListLength(h)); printf("\n"); //輸出順序表h的長度
if(ListEmpty(h)) printf("該單鏈表為空。\n");
else printf("該單鏈表不為空。\n"); //判斷順序表h是否為空

GetElem(h,3,e);printf("該單鏈表的第3個元素為:");
printf("%c",e); printf("\n"); //輸出順序表h的第3個元素
printf("該單鏈表中a的位置為:");
printf("%d",LocateElem(h,'a')); printf("\n"); //輸出元素'a'的位置

ListInsert(h,4,'f'); //在第4個元素位置插入'f'素
printf("在第4 個元素位置上插入'f'後單鏈表為:");
DispList(h); printf("\n"); //輸出順序表h

ListDelete(h,3,e); //刪除L的第3個元素
printf("刪除第3個元素後單鏈表為:");
DispList(h); printf("\n"); //輸出順序表h

DestroyList(h); //釋放順序表h
return 0;
}

㈧ 用C語言建立一個順序存儲的線性表並實現線性表的插入和刪除操作

鏈表
1。是由結構體和指針構成的。
2。包括兩個部分一個是數據域和指針域。
3。鏈表中的結點分為兩類:頭結點和一般結點。頭結點是沒有數據域的。
4。基本操作有:初始化鏈表,增加結點和刪除結點,求鏈表的長度等等。
struct Linknode{
int data;
struct Linknode *next;
};
這個地方有個知識點:這個是鏈表的數據結構是有結構體和指針構成。結構體名為Linknode.但這裡面沒有定義結構體變數,只有我們定義了結構體變數才能使用結構體。
結構體變數怎麼定義呢?
有兩種方式:
1。struct Linknode Linklist;
2.typedef struct linknode Linklist.
一般我們都希望採用第2種,這樣的好處是: 當我們再定義結構體變數時,可以用:Linklist p;而如果我們採用第一種還必須採用 struct Linknode p;對比一下就可以知道第2種要簡單很多。那麼下面我們都採用第2種方式來定義結構體變數。
上面我們已經定義了一個鏈表:
1。初始化鏈表。
#include
#include
int InitLinkList(Linklist **Lnode)
{
*Lnode=(Linklist)malloc(sizeof(Linklist));//*Lnode等於L,對與*Lnode的分配空間相當與對主函數中的L分配空間。
if(!*Lnode)
return 0;
(*Lnode)->next=NULL;
}
在初始化鏈表的時候,我們用到了2級指針為什麼呢?因為我們希望在InitLinkList函數生成的頭結點,主函數中也能指向這個頭結點。如果我們用一級指針的話,用malloc分配空間的時候,它將會返回分配空間的首地址給指針變數Lnode,而不能使是的空間被主函數中指針變數L得到這個地址。所以我們要用2級指針。
void main()
{
Linklist *L;
InitLikList(&L);
}
2。增加鏈表結點
增加鏈表結點其實很簡單,一般用到三個結構體指針變數和一個循環結構。
InsertLinkList(Linklist *Lnode)
{
Linklist *p,*q;
int d;
{
scanf("%d",&d);
if(d==-9999)
break;
p=Lnode->next;//p指向頭結點
//通過while循環和指針變數p定位要插入的結點q的位置。
while(p)
p=p->next;
//生成一個要插入的結點
q=(Linklist)malloc(sizeof(Linklist));//申請要插入的結點空間
q->data=d;//填充要插入結點的數據域
q->next=p->next;//首先填充要插入結點q的指針域進行填充。
p->next=q;//然後把定位好的p指針域進行修改指向q.

}while(9);//循環退出的條件是輸入的數據-9999

}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入結點
}
3。求鏈表的長度:
int LengthLinkList(Linklist *Lnode)
{
int i=0;
Linklist *p;
p=Lnode->next;//p指向鏈表的第一個結點。
while(p)
{
i++;
p=p->next;
}
return i;
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入一個結點
LengthLinkList(L)//求鏈表的長度。
}
4.刪除結點
刪除鏈表結點其實很簡單,一般用到三個結構體指針變數和一個循環結構。
DestroyLinkList(Linklist *Lnode)
{
Linklist *p,*q;
p=Lnode;//p指向鏈表的頭結點
while(p)
{
q=p->next;//q指向當前結點的下一個結點。
free(p);//釋放當前結點
p=q;//p指向下一個結點
}
}
void main()
{
Linklist *L;
InitLinkList(&L);//生成一個頭結點
InsertLinkList(L);//插入結點
LengthLinkList(L)//求鏈表的長度。
DestroyLinkList(L);//刪除鏈表結點
}

㈨ 數據結構(C語言版)線性表的操作

//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int *elem;
int length;
int listsize;
}sqlist;
void initlist_sq(sqlist *L){ /*注意這里*/
L->elem=(int *)malloc(5*sizeof(sqlist)); /*注意這里*/
if(!L->elem) /*注意這里*/
exit(0);
L->length=0; /*注意這里*/
L->listsize=5; /*注意這里*/
}
int main()
{
int i;
sqlist p;
initlist_sq(&p); /*注意這里*/
for(i=0;i<5;i++)
{
printf("%d ",i);
scanf("%d",&p.elem[i]);
p.listsize++;
}
printf("%d\n",p.listsize);
for(i=0;i<5;i++)
{
printf("%d\n",p.elem[i]);
p.listsize--;
}
printf("%d",p.listsize);

}
//---------------------------------------------------------------------------

㈩ 怎樣創建線性表(C語言)

線性表是個抽象的概念,沒辦法直接創建抽象類型,需要具體的類型(比如數組,鏈表)。
比如創建數組:int array[100];
創建一個GList鏈表: GList * list = NULL; (空的)

熱點內容
php判斷手機訪問 發布:2025-01-13 10:46:06 瀏覽:762
資料庫十張表 發布:2025-01-13 10:41:50 瀏覽:395
仿php 發布:2025-01-13 10:41:40 瀏覽:811
後綴解壓什麼意思 發布:2025-01-13 10:35:17 瀏覽:185
索尼安卓11如何退回安卓10 發布:2025-01-13 10:24:09 瀏覽:127
程序編譯結構 發布:2025-01-13 10:24:08 瀏覽:90
創建郵箱地址伺服器連接錯誤 發布:2025-01-13 09:49:24 瀏覽:723
linux編輯文檔 發布:2025-01-13 09:47:51 瀏覽:435
二手製冷壓縮機 發布:2025-01-13 09:43:59 瀏覽:585
網魚電腦密碼多少 發布:2025-01-13 09:33:46 瀏覽:464