C语言写链表
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;//存放數據域;
struct Node * pnext;//存放struct Node 類型地址
}node,* pnode;//node 等價于struct Node ,pnode等價于struct Node *;
pnode creat_link();//創建非循環單鏈表
void tranverse_link(pnode pHead);//遍歷鏈表
bool isEmpty(pnode pHead);
int length_link(pnode pHead);
void ?sortAsc_link(pnode pHead);
void ?insert_link(pnode pHead,int pos,int contend);//在第pos個結點的前面插入一個結點,pos從1開始
// ?插入結點?
int ?delete_link(pnode pHead,int pos);//刪除第pos個結點
bool insert_linknew(pnode pHead,int pos,int contend);
bool ?delete_linknew(pnode pHead,int pos,int *deletedata);
int main(void){
? ? pnode pHead=creat_link();
// tranverse_link(pHead);
isEmpty(pHead);
int length=length_link(pHead);
printf("鏈表長度為:%d\n",length);
printf("排序后的鏈表數據\n");
sortAsc_link(pHead);
tranverse_link(pHead);
insert_linknew(pHead,4,100);
? ? int len=length_link(pHead);
printf("插入后鏈表長度為:%d\n",len);
printf("插入后鏈表數值為:\n");
tranverse_link(pHead);
int deletedata= delete_link(pHead,3);
? ? printf("刪除的數據為:%d\n",deletedata);
int datadelete;
if(delete_linknew(pHead,2,&datadelete))
{
? ?printf("刪除的數據是:%d\n",datadelete);
}
return 0;
}
pnode creat_link(){
? ? int len;
int val;
int i;//循環變量
pnode pHead=(pnode) malloc(sizeof(node));
if(pHead==NULL){
printf("分配內存失敗,程序退出!");
exit(-1);
}
pnode pTail=pHead;
pTail->pnext=NULL;
printf("請輸入結點個數:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("輸入第%d個結點的值:",i+1);
scanf("%d",&val);
pnode pnew=(pnode) malloc(sizeof(node));
pnew->data=val;
pTail->pnext=pnew;
pnew->pnext=NULL;
pTail=pnew;
}
? ? ? ? ??
? ?return pHead;
}
//遍歷鏈表中的數據
void tranverse_link(pnode pHead){
? ? ?pnode p=pHead->pnext;//p指向第一個結點
while(p!=NULL){
? ? ? printf("%d\n",p->data);
?p=p->pnext;
}
?
return;
}
bool isEmpty(pnode pHead){
pnode p=pHead->pnext;
if(p==NULL){
printf("鏈表為空!\n");
return true;
}
else{
printf("鏈表不為空!\n");
return false;
}
}
int length_link(pnode pHead){
pnode p=pHead->pnext;//p指向第一個結點
int len=0;
while(p!=NULL){
? ?len++;
? ? ? ? p=p->pnext;
}
return len;
}
void ?sortAsc_link(pnode pHead){
?pnode p,q;
?int len=length_link(pHead);
?int ?i,j;
?for(i=0,p=pHead->pnext;i<len-1;i++,p=p->pnext)
?{
??
for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext){
if(p->data>=q->data){
? ? int middata=p->data;
p->data=q->data;
q->data=middata;
}
}
??
?}
? ?
}
//插入一個結點
void ?insert_link(pnode pHead,int pos,int contend){ ?
int len=length_link(pHead);
pnode p=pHead->pnext;
for(int i=0;i<len;i++,p=p->pnext){
if((pos-2)==i){
? ? ? ? ? pnode pinsert=(pnode)malloc(sizeof(node));
?pinsert->data=contend;
?pinsert->pnext=p->pnext;
?p->pnext=pinsert;
}
? ??
}
}
int delete_link(pnode pHead,int pos){
? ? pnode p=pHead->pnext;
int len=length_link(pHead);
int deletedata;
? ? for(int i=0;i<len;i++,p=p->pnext){
if(pos-2==i){
?pnode q=p->pnext;
?deletedata=q->data;
?p->pnext=q->pnext;
?free(q);
?break;
}
}
? ? ? ? ?return deletedata;
}
bool insert_linknew(pnode pHead,int pos,int contend){
? ??
? ? ?pnode p=pHead->pnext;
int i=0;
while(p!=NULL&&i<pos-1)
{
? ? ?
? ? p=p->pnext;
i++;
? ? ?
}
? ?//若要插入的結點的位置是鏈表的最后一個位置則不插入
if(pos<0||p->pnext==NULL){
printf("插入位置不合適\n");
? ?return false;?
}
? ? ??
? ?pnode pnew =(pnode)malloc(sizeof(node));
if(pnew==NULL){
? printf("內存分配失敗!");
? exit(-1);
}
? ? ? ? pnode q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;
pnew->data=contend;
return true;
}
bool ?delete_linknew(pnode pHead,int pos,int *deletedata){
? ? ? ? ? ?pnode p=pHead->pnext;
? int i=0;
? while((p->pnext!=NULL)&&(i<(pos-2))){
? ?p=p->pnext;
i++;
??
? }
? ?
? if(p->pnext==NULL||pos<0){
? ? printf("刪除鏈表位置不正確\n");
return false;
??
? }
? ? ? ? ? ??
? pnode save=p->pnext;
? p->pnext=save->pnext;
? *deletedata=save->data;
? free(save);
? ? ? ? ? ? return ?true;
}
#include<stdlib.h>
typedef struct Node{
int data;//存放數據域;
struct Node * pnext;//存放struct Node 類型地址
}node,* pnode;//node 等價于struct Node ,pnode等價于struct Node *;
pnode creat_link();//創建非循環單鏈表
void tranverse_link(pnode pHead);//遍歷鏈表
bool isEmpty(pnode pHead);
int length_link(pnode pHead);
void ?sortAsc_link(pnode pHead);
void ?insert_link(pnode pHead,int pos,int contend);//在第pos個結點的前面插入一個結點,pos從1開始
// ?插入結點?
int ?delete_link(pnode pHead,int pos);//刪除第pos個結點
bool insert_linknew(pnode pHead,int pos,int contend);
bool ?delete_linknew(pnode pHead,int pos,int *deletedata);
int main(void){
? ? pnode pHead=creat_link();
// tranverse_link(pHead);
isEmpty(pHead);
int length=length_link(pHead);
printf("鏈表長度為:%d\n",length);
printf("排序后的鏈表數據\n");
sortAsc_link(pHead);
tranverse_link(pHead);
insert_linknew(pHead,4,100);
? ? int len=length_link(pHead);
printf("插入后鏈表長度為:%d\n",len);
printf("插入后鏈表數值為:\n");
tranverse_link(pHead);
int deletedata= delete_link(pHead,3);
? ? printf("刪除的數據為:%d\n",deletedata);
int datadelete;
if(delete_linknew(pHead,2,&datadelete))
{
? ?printf("刪除的數據是:%d\n",datadelete);
}
return 0;
}
pnode creat_link(){
? ? int len;
int val;
int i;//循環變量
pnode pHead=(pnode) malloc(sizeof(node));
if(pHead==NULL){
printf("分配內存失敗,程序退出!");
exit(-1);
}
pnode pTail=pHead;
pTail->pnext=NULL;
printf("請輸入結點個數:");
scanf("%d",&len);
for(i=0;i<len;i++){
printf("輸入第%d個結點的值:",i+1);
scanf("%d",&val);
pnode pnew=(pnode) malloc(sizeof(node));
pnew->data=val;
pTail->pnext=pnew;
pnew->pnext=NULL;
pTail=pnew;
}
? ? ? ? ??
? ?return pHead;
}
//遍歷鏈表中的數據
void tranverse_link(pnode pHead){
? ? ?pnode p=pHead->pnext;//p指向第一個結點
while(p!=NULL){
? ? ? printf("%d\n",p->data);
?p=p->pnext;
}
?
return;
}
bool isEmpty(pnode pHead){
pnode p=pHead->pnext;
if(p==NULL){
printf("鏈表為空!\n");
return true;
}
else{
printf("鏈表不為空!\n");
return false;
}
}
int length_link(pnode pHead){
pnode p=pHead->pnext;//p指向第一個結點
int len=0;
while(p!=NULL){
? ?len++;
? ? ? ? p=p->pnext;
}
return len;
}
void ?sortAsc_link(pnode pHead){
?pnode p,q;
?int len=length_link(pHead);
?int ?i,j;
?for(i=0,p=pHead->pnext;i<len-1;i++,p=p->pnext)
?{
??
for(j=i+1,q=p->pnext;j<len;j++,q=q->pnext){
if(p->data>=q->data){
? ? int middata=p->data;
p->data=q->data;
q->data=middata;
}
}
??
?}
? ?
}
//插入一個結點
void ?insert_link(pnode pHead,int pos,int contend){ ?
int len=length_link(pHead);
pnode p=pHead->pnext;
for(int i=0;i<len;i++,p=p->pnext){
if((pos-2)==i){
? ? ? ? ? pnode pinsert=(pnode)malloc(sizeof(node));
?pinsert->data=contend;
?pinsert->pnext=p->pnext;
?p->pnext=pinsert;
}
? ??
}
}
int delete_link(pnode pHead,int pos){
? ? pnode p=pHead->pnext;
int len=length_link(pHead);
int deletedata;
? ? for(int i=0;i<len;i++,p=p->pnext){
if(pos-2==i){
?pnode q=p->pnext;
?deletedata=q->data;
?p->pnext=q->pnext;
?free(q);
?break;
}
}
? ? ? ? ?return deletedata;
}
bool insert_linknew(pnode pHead,int pos,int contend){
? ??
? ? ?pnode p=pHead->pnext;
int i=0;
while(p!=NULL&&i<pos-1)
{
? ? ?
? ? p=p->pnext;
i++;
? ? ?
}
? ?//若要插入的結點的位置是鏈表的最后一個位置則不插入
if(pos<0||p->pnext==NULL){
printf("插入位置不合適\n");
? ?return false;?
}
? ? ??
? ?pnode pnew =(pnode)malloc(sizeof(node));
if(pnew==NULL){
? printf("內存分配失敗!");
? exit(-1);
}
? ? ? ? pnode q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;
pnew->data=contend;
return true;
}
bool ?delete_linknew(pnode pHead,int pos,int *deletedata){
? ? ? ? ? ?pnode p=pHead->pnext;
? int i=0;
? while((p->pnext!=NULL)&&(i<(pos-2))){
? ?p=p->pnext;
i++;
??
? }
? ?
? if(p->pnext==NULL||pos<0){
? ? printf("刪除鏈表位置不正確\n");
return false;
??
? }
? ? ? ? ? ??
? pnode save=p->pnext;
? p->pnext=save->pnext;
? *deletedata=save->data;
? free(save);
? ? ? ? ? ? return ?true;
}
總結
- 上一篇: 用c语言 简单实现JAVA里面的Arry
- 下一篇: 测试isEmpty null 方法