創建單鏈表,首先要建立一個結構體,如下:
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Lnode{ ElemType data; struct Lnode *next; }Lnode,*LinkList;
創建鏈表,這里使用的是尾插法建立鏈表,它主要是在表尾不斷地添加新元素,直到輸入-1,然后退出。
LinkList CreatList()//創建列表 { ElemType x; LinkList head,p,tail; head=(LinkList)malloc(sizeof(Lnode)); head->next=NULL; tail=head; scanf("%d",&x); while(x!=-1){ p=(LinkList)malloc(sizeof(Lnode)); p->data=x; p->next=NULL; tail->next=p; tail=p; scanf("%d",&x); } return head; }
計算表長,運用遍歷,將鏈表的長度利用一個變量存儲,然后有指針存儲。
int LongList(LinkList head,int* length)//計算表長 第一個元素列表 第二個存儲表長 { LinkList p; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; if(p==NULL){ return 0; } int i=1; while(p){ p=p->next; i++; } *length=i-1;//因為每次先查詢后面的元素,所以i也把最后一個NULL加了進去,所以要減一 return 1; }
插入元素,單鏈表插入元素,需要知道該位置的鏈表元素,然后先將插入元素的尾部連接到鏈表內,再將該節點的頭部接入。
int insert(LinkList head,int i,ElemType x)//插入 1鏈表 2插入位置 3插入元素 { LinkList p,s; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; int j=1; while(p&&j!=i-1){ p=p->next; j++; } if(p==NULL||j!=i-1){ return 0; } s=(LinkList)malloc(sizeof(Lnode)); s->data=x; s->next=p->next; p->next=s; return 1; }
刪除元素,需要知道該元素前面位置的鏈表節點,然后進行刪除,並返回刪除元素,同時也要將該節點內存釋放。
int DelList(LinkList head,int i,ElemType *n)//刪除元素 1鏈表 2刪除位置 3記錄刪除元素 { LinkList p,s; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; s=(LinkList)malloc(sizeof(Lnode)); int j=1; while(j!=i-1&&p){ p=p->next; j++; } if(j!=i-1||p->next==NULL){ return 0; } s=p->next; p->next=s->next; *n=s->data; free(s); return 1; }
查詢元素,利用遍歷列表,找到要查找位置的元素,並返回。
int search(LinkList head,int i,ElemType *n)//查找元素 1鏈表 2查找元素的位置 3該位置上的元素是什么 { LinkList p; p=(LinkList)malloc(sizeof(Lnode)); p=head->next; int j=1; while(j!=i&&p){ p=p->next; j++; } if(p==NULL||j!=i){ return 0; } *n=p->data; return 1; }
輸出單鏈表所有元素。
void print(LinkList head)//輸出 { LinkList p; p=head->next; while(p){ printf("%d ",p->data); p=p->next; } }
在該鏈表的創建和基本操作中,我都返回了0或1,其作用是測試單鏈表的操作是否符合規則,操作成功,返回1,失敗,返回0。
