線性表之鏈式儲存
阿新 • • 發佈:2018-11-10
連結串列的儲存結構
typedef int ElementType;
typedef struct Node
{
ElementType data;
struct Node* next;
}LNode;
連結串列的基本運算
- 連結串列的初始化
沒有頭結點的連結串列
LNode* init()
{
LNode* List=(LNode*)malloc(sizeof(Node*));
List=NULL;
return List;
}
- 求表長
int length(LNode* List)
{
LNode* L=List;
int len=0;
while(L){
L=L->next;
len++;
}
return len;
}
- 查詢
按位置查詢
LNode* find(LNode* List,int k)
{
LNode* L=List;
int i=1;
while(L!=NULL && i<k)
{
L=L->next;
i++;
}
if(i==k) return L;
return NULL;
}
按值查詢
LNode* Find(LNode* List,ElementType value)
{
LNode* L=List;
while(L!=NULL && L->data!=value){
L=L->next;
}
return L;
}
- 頭插法
//有返回值的頭插
LNode* head_insert(LNode* List,ElementType value)
{
//LNode* p=List;
LNode* L=(LNode*)malloc(sizeof(Node));
L->data=value;
L->next=List;
printf("-------------\n");
return L ;
}
//返回值為void的頭插
void head_insert(LNode** List,ElementType value)
{
//LNode* p=List;
LNode* L=(LNode*)malloc(sizeof(Node));
L->data=value;
L->next=*List;
*List=L;
}
- 尾插法
void foot_insert(LNode** List,ElementType value)
{
LNode* L=*List;
LNode* p=(LNode*)malloc(sizeof(Node));
p->data=value;
p->next=NULL;
if(*List==NULL){
*List=p;
}
else{
while(L->next){
L=L->next;
}
L->next=p;
}
}
- 從某一位置插入(包括頭尾)
void i_insert(LNode** List,int i,ElementType value)
{
LNode* p=(LNode*)malloc(sizeof(Node));
p->data=value;
if(i==1){
p->next=*List;
*List=p;
return;
}
else{
//LNode* L=*List;
LNode* pre=find(*List,i-1);
if(pre==NULL)
{
printf("位置錯誤");
return;
}
p->next=pre->next;
pre->next=p;
}
}
- 從某一位置刪除
void i_delete(LNode** List,int i)
{
if(i==1){
LNode* p=*List;
*List=p->next;
free(p);
}
else{
//LNode* L=*List;
LNode* pre=find(*List,i-1);
if(pre==NULL)
{
printf("位置錯誤");
return;
}
LNode* p=pre->next;
pre->next=p->next;
free(p);
}
}
- 單鏈表的倒置
void reverse(LNode** List)
{
//LNode* L=*List;
LNode* p,*q;
p=*List;
*List=NULL;
while(p!=NULL){
q=p;
p=p->next;
q->next=*List;
*List=q;
}
}
- 刪除連結串列中重複的元素
void del_repeat(LNode** List)
{
LNode* L=*List;
LNode* q,*p,*r;
p=L;
while(p!=NULL)
{
q=p;
while(q->next)
{
if(q->next->data==p->data){
r=q->next;
q->next=r->next;
free(r);
}
else
q=q->next;
}
p=p->next;
}
}
10.找出A連結串列中屬於連結串列A但不屬於連結串列B的元素
void difference(LNode** LA,LNode* LB)
{
LNode* p,*q,*pre,*r;
p=*LA;
pre=p;
while(p!=NULL)
{
q=LB;
if(p==*LA && p->data==q->data){
r=p;
*LA=p->next;
p=p->next;
pre=p;
free(r);
}
else{
while(q!=NULL && q->data!=p->data) q=q->next;
if(q!=NULL){
r=p;
pre->next=p->next;
p=p->next;
free(r);
}
else{
pre=p;
p=p->next;
}
}
}
}
- 輸出連結串列中的元素
void print(LNode* List)
{
LNode* L=List;
while(L!=NULL){
printf("%d*****\n",L->data);
L=L->next;
}
}