c語言單鏈表的基本操作(代碼)

c語言實現單鏈表的基本操作:建立、打印、刪除、插入、逆序。僅供學習之用還需不斷完善,有待讀者自己研究

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


typedef struct stu
{
	int data; //數據
	struct stu *next; //指向下一節點的指針
}node;

node *creat(int n)//創建鏈表
{
    node *head,*p1,*p2;
    int i;
    head=p1=p2=(node *)malloc(sizeof(node));//創建節點
    for(i=0;i<n;i++)//利用for語句實現節點數目限制
    {
        if(p2->next!=NULL)
        {
			scanf("%d",&p1->data);
			p2->next=p1;//p2->next保存p1,p2指向最後一個節點
			p2=p1;
			p1=(node *)malloc(sizeof(node));//創建下一個節點
        }
    }
    p2->next=NULL;
    return head;
}

void print(node *head)//打印鏈表
{
    node *p=head;
    while(p!=NULL)//節點不爲空
    {
        printf("%d\n",p->data);//輸出節點
        p=p->next;//指向下一個節點
    }
}

node *search(node *head,int data)//查找數據
{
    node *p=head;
    for(;p!=NULL;p=p->next)//遍歷整個鏈表
    {
        if(data==p->data)//對比數據
        printf("%3d,%3d\n",p,p->data);//輸出地址和數據
    }
}

node *insert(node *head,int n)//節點插入
{
	int n_1=1;
	node *p1=head,*p2;
	node *s=(node *)malloc(sizeof(node));//創建新節點
	printf("輸入插入的數據:");
	scanf("%d",&s->data);
	while(n_1!=n)//對比節點
	{
		p2=p1;//p2保存p1位置
		p1=p1->next;//p1後移
		n_1++;//節點計數
	}
	if(n_1==n)
	{
		if(head==p1)//表頭
		{
            s->next=head;//修改head和新節點指針關係
            head=s;
		}
		else//表間
		{
            s->next=p1;//修改新節點和p1,p2的指針關係
            p2->next=s;
		}
	}
	return head;
}

/*node *insert(node *head,int data)
{
	node *p1=head,*p2;
	node *s=(node *)malloc(sizeof(node));//創建新節點
	printf("輸入插入的數據:");
	scanf("%d",&s->data);
	while(p1->data!=data)//對比數據域
	{
		p2=p1;//p2保存p1位置
		p1=p1->next;//p1後移
	}
	if(p1->data=data)
	{
		if(head==p1)//表頭
		{
            s->next=head;//修改head和新節點指針關係
            head=s;
		}
		else//表間
		{
            s->next=p1;//修改新節點和p1,p2的指針關係
            p2->next=s;
		}

	}
	return head;
}*/

node *del(node *head,int n)//刪除節點
{
    int n_1=1;
    node *p1=head,*p2=NULL;
    while(n_1!=n)//對比節點
	{
		p2=p1;//p2保存p1的位置
		p1=p1->next;//p1後移
		n_1++;//節點計數
	}
	if(n_1==n)
	{
		if(p1==head)//表頭
		{
			head=p1->next;//head指向第二個節點,孤立表頭
			free(p1);//釋放孤立出來的節點(即從內存中刪除)
		}
		else
		{
            p2->next=p1->next;//孤立出要刪除的節點
            free(p1);//釋放孤立出的節點(即要刪除的節點)
		}
	}
	return head;
}

/*node *del(node *head,int data)
{
    node *p1=head,*p2;
    while(p1->data!=data)//對比數據域
	{
		p2=p1;//p2保存p1位置
		p1=p1->next;//p1後移
	}
	if(p1->data==data)
	{
		if(p1==head)//表頭
		{
			head=p1->next;//head指向第二個節點,孤立表頭
			free(p1);//釋放孤立出來的節點(即從內存中刪除)
		}
		else
		{
            p2->next=p1->next;//孤立出要刪除的節點
            free(p1);//釋放孤立出的節點(即要刪除的節點)
		}
	}
	return head;
}*/

void del_a(node *head)//刪除鏈表
{
    node *tmp,*p=head;
    while(p!=NULL)
    {
        tmp=p;//tmp保存d位置
        p=p->next;//p指向下一個節點
        free(tmp);//釋放節點
    }
    head=NULL;
}

node *reverse(node *head)//逆序鏈表
{
    node *p1,*p2,*p3;
    if(head==NULL||head->next==NULL)
    return head;
    p2=head;//指向第一個節點
    p1=head->next;//指向第二個節點
    head->next=NULL;//第一個節點後繼置空
    while(p1!=NULL)
    {
        p3=p2;//p3指向p2位置
        p2=p1;//p2指向p1位置
        p1=p1->next;//p1指向下一個節點
        p2->next=p3;//逆序節點
    }
    head=p2;//頭指針指向逆序後的第一個節點
    return head;
}

/*node *reverse(node *head)
{
	node *p1,*p2,*p3;
	if(head == NULL || head->next == NULL)
    return head;

	p1=head;//指向第一個節點
	p2=head->next;//指向第二個節點
	head->next=NULL;
	while(p2!=NULL)
	{
		p3=p2->next;//將下一個節點保存下來
		p2->next=p1;//將當前節點的下一節點置爲前節點
		p1=p2;//將當前節點保存爲前一節點
		p2=p3;//將當前節點置爲下一節點
	}
	head=p1;
	return head;
}*/

int main()
{
    int n,n1,n2;
    node *p,*p2;
    FILE *fp;
    fp=fopen("file.txt","w+");
    while(1)
    {
        printf("1 創建一個鏈表\n2 插入一個節點\n3 刪除一個節點\n4 存儲到文本file.txt\n5 刪除整個鏈表\n6 查找數據\n7 逆序鏈表\n8 打印鏈表\n");
        scanf("%d",&n);
        switch(n)
        {
		case 1:
            printf("輸入五個節點信息:\n");
            p=creat(5);
            printf("\n");
            print(p);
            break;
		case 2:
            printf("在那個節點之前插入:");
            scanf("%d",&n1);
            p=insert(p,n1);
            printf("\n");
            print(p);
            break;
		case 3:
            printf("刪除那個節點:");
            scanf("%d",&n1);
            p=del(p,n1);
            printf("\n");
            print(p);
            break;
        case 4:
            printf("存儲到文本file.txt\n");
            p2=p;
            for(;p2!=NULL;p2=p2->next)
            fprintf(fp,"%5d",p2->data);
            fclose(fp);
            break;
		case 5:
            printf("刪除整個鏈表\n");
            del_a(p);
            break;
        case 6:
            printf("查找的數據:");
            scanf("%d",&n2);
            search(p,n2);
            break;
        case 7:
            printf("逆序鏈表\n");
            p=reverse(p);
            print(p);
            break;
        case 8:
            printf("輸出鏈表\n");
            print(p);
            break;

        }
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章