/* 6 線性表的鏈式結構實現 */
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int TYPE;//定義數據類型別名
//聲明結點結構體
typedef struct Node
{
TYPE data;//存儲結點數據
struct Node* next;//指向下一節點
}Node;
//聲明鏈表結構體
typedef struct
{
Node* head;//頭指針
int length;//鏈表長度
}lineList;
/*對單鏈表的操作*/
bool init(lineList* list);//鏈表初始化
bool input(lineList* list,int pos,TYPE elem);//插入操作
/*因爲使用了c++編譯器,所以在delete後面加了1*/
TYPE delete1(lineList* list,int pos);//刪除操作
int length(lineList* list);//鏈表長度
void traverse(lineList* list);//遍歷操作
int search(lineList* list,TYPE elem);//查詢指定元素的位置
void clear(lineList* list);//鏈表清空
void destroy(lineList* list);//銷燬鏈表
int main()
{
lineList list;
//初始化測試
bool flag=init(&list);
if(flag)
printf("初始化成功!\n");
else
printf("初始化失敗!\n");
for(int i=0;i<6;i++) //循環測試6次
{
//插入操作測試
printf("輸入插入的位置:");
int pos=0;
scanf("%d",&pos);
printf("輸入插入的數值:");
TYPE elem=0;
scanf("%d",&elem);
flag=input(&list,pos,elem);
if(flag)
printf("插入成功!\n");
else
printf("插入位置不合法,插入失敗!\n");
//遍歷操作測試
printf("遍歷鏈表:");
traverse(&list);
//鏈表長度測試
printf("鏈表的長度爲:%d\n",length(&list));
//搜索鏈表
printf("輸入要搜素的元素:");
scanf("%d",&elem);
pos=search(&list,elem);
if(pos!=-1)
printf("元素%d在鏈表的第%d個位置\n",elem,pos);
else
printf("不存在,查找失敗!\n");
//刪除操作測試
printf("輸入要刪除的位置:");
scanf("%d",&pos);
elem=delete1(&list,pos);
if(elem!=-1)
printf("刪除的元素是:%d\n",elem);
else
printf("刪除位置不合法或者鏈表已空,刪除失敗!\n");
printf("刪除後遍歷鏈表:");
traverse(&list);
printf("刪除後鏈表的長度爲:%d\n",length(&list));
}
//清空鏈表
clear(&list);
printf("清空後遍歷鏈表:");
traverse(&list);
//銷燬鏈表
destroy(&list);
return 0;
}
//鏈表初始化
bool init(lineList* list)
{
Node* p=(Node*)malloc(sizeof(struct Node));
if(p)
{
p->next=NULL;
list->head=p;
list->length=0;
return true;
}
else
return false;
}
//插入操作
bool input(lineList* list,int pos,TYPE elem)
{
if(pos>0&&pos<=length(list)+1)
{
Node* p=(Node*)malloc(sizeof(struct Node));
if(p)
{
p->data=elem;
Node* q=list->head;
for(int i=1;i<pos;i++)
{
q=q->next;
}
p->next=q->next;
q->next=p;
list->length++;
return true;
}
else
return false;
}
else
return false;
}
//刪除操作
TYPE delete1(lineList* list,int pos)
{
if(0!=length(list)&&pos>0&&pos<=length(list))
{
Node* p=list->head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
Node* q=p->next;
TYPE elem=q->data;
p->next=p->next->next;
free(q);
q=NULL;
list->length--;
return elem;
}
else
return -1;//返回-1代表刪除失敗
}
//鏈表長度
int length(lineList* list)
{
return list->length;
}
//遍歷鏈表
void traverse(lineList* list)
{
Node* p=list->head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//搜索鏈表
int search(lineList* list,TYPE elem)
{
Node* p=list->head->next;
int pos=0;
while(p)
{
if(p->data==elem)
{
break;
}
else
{
pos++;
p=p->next;
}
}
if(pos==length(list))
return -1;
else
return pos+1;
}
//清空鏈表
void clear(lineList* list)
{
destroy(list);
init(list);
}
//銷燬鏈表
void destroy(lineList* list)
{
Node* p=list->head->next;
while(length(list))
{
Node* q=p;
p=p->next;
free(q);
q=NULL;
list->length--;
}
free(list->head);
list->head=NULL;
}
線性表的鏈式結構實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.