鱼C论坛

 找回密码
 立即注册
查看: 1771|回复: 6

C++单链表问题

[复制链接]
发表于 2014-7-13 19:28:25 | 显示全部楼层 |阅读模式
1鱼币
最近在写单链表,但是运行老是出问题,希望大神可以写一个带head,tail,curr的单向链表,有insert功能就行了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-13 19:28:26 | 显示全部楼层
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define LEN sizeof(struct student)
struct student *create();//创建链表
struct student *del(struct student *head, int num);//删除链表中数字 (链表头指针,要删除的学号)
struct student *insert(struct student *head, struct student *head_2);//网链表中加元素(链表头指针,要加的那个的)
void print(struct student *head);//输出链表
struct student *clear(struct student *head);//清空链表
void change(struct student *head, int num, float score);//更改链表数据

struct student
{
        long int num;
        float score;
        struct student *next;
};
int n;
char ch;
int main()
{
        struct student *head, head_2;
        int num, i;
        float score;
        printf("请先建立一个链表!(要结束请在number处输入0)\n");
        head = create();
s:        fflush(stdin);
        printf("---------------------------------------------------------\n");
        printf("请选择要的操作:\n");
        printf("1.打印记录     ");
        printf("2.插入记录     ");
        printf("3.删除记录     \n");
        printf("4.更改记录     ");
        printf("5.清除记录     ");
        printf("6.退出程序     \n");
        printf("---------------------------------------------------------\n");
        //scanf("%d", &i);
        scanf_s("%d", &i);
        switch (i)//根据用户输入的不同数字来执行不同的代码
        {
        case 1:
                print(head);
                goto s;
                break;
        case 2:
        s4 : fflush(stdin);
                printf("what number are you want to insert:");
                scanf_s("%d", &head_2.num);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s4;
                        }
                }
        s5:                fflush(stdin);
                printf("what score are you want to insert:");
                scanf_s("%f", &head_2.score);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s5;
                        }
                }
                head = insert(head, &head_2);
                goto s;
                break;
        case 3:
        s6 : fflush(stdin);
                printf("please putinto the number you want to delete:");
                scanf_s("%ld", &num);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s6;
                        }
                }
                head = del(head, num);
                goto s;
                break;
        case 4:
        s7 : fflush(stdin);
                printf("Please putinto the number you want to change:");
                scanf_s("%d", &num);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s7;
                        }
                }
        s8:        fflush(stdin);
                printf("Please putinto the score you want to save:");
                scanf_s("%f", &score);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s8;
                        }
                }
                change(head, num, score);
                break;
        case 5:
                head = clear(head);
                break;
        case 6:
                return 0;
                break;
        default:
                printf("对不起,你的输入有误,请重新输入!");
                goto s;
                break;
        }

        goto s;
}
struct student *create()
{
        struct student *head;
        struct student *p1, *p2;
s:        fflush(stdin);
        head = NULL;
        p1 = p2 = (struct student *)malloc(LEN);
        printf("Please purinto student's munber:");
        scanf_s("%ld", &p1->num);
        while ((ch = getchar()) != '\n')
        {
                if ((ch >= 48 && ch <= 57) || ch == 46)
                {
                        ;
                }
                else
                {
                        printf("你的输入有误!\n");
                        goto s;
                }
        }
s1:        printf("Please putinto student's score:");
        fflush(stdin);
        scanf_s("%f", &p1->score);
        while ((ch = getchar()) != '\n')
        {
                if ((ch >= 48 && ch <= 57) || ch == 46)
                {
                        ;
                }
                else
                {
                        printf("你的输入有误!\n");
                        goto s1;
                }
        }
        n = 0;
        while (p1->num)
        {
                n++;
                if (n == 1)
                {
                        head = p1;
                }
                else
                {
                        p2->next = p1;
                }
                p2 = p1;
                p1 = (struct student *)malloc(LEN);
        s2:        fflush(stdin);
                printf("Please purinto student's munber:");
                scanf_s("%ld", &p1->num);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s2;
                        }
                }
                if (p1->num == 0)
                {
                        goto e;
                }
        s3:        fflush(stdin);
                printf("Please putinto student's score:");
                scanf_s("%f", &p1->score);
                while ((ch = getchar()) != '\n')
                {
                        if ((ch >= 48 && ch <= 57) || ch == 46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s3;
                        }
                }
        }
e:        p2->next = NULL;
        return head;
}

void print(struct student *head)
{
        struct student *p;
        p = head;
        printf("共有%d条记录:\n", n);
        if (head)
        {
                do
                {
                        printf("%ld号学生的成绩是:%f\n", p->num, p->score);
                        p = p->next;
                } while (p);
        }
}

struct student *del(struct student *head, int num)
{
        struct student *p1, *p2;
        p2 = head;
        if (NULL == head)
        {
                printf("The List is NULL!\n");
                goto END;
        }


        p1 = head;
        while (p1->num != num&&p1->next != NULL)
        {
                p2 = p1;
                p1 = p1->next;
        }

        if (num == p1->num)
        {
                if (p1 == head)
                {
                        head = p1->next;
                        printf("Delete NO.%d succeed!\n", num);
                        n--;
                }
                else
                {
                        p2->next = p1->next;
                        printf("Delete NO.%d succeed!\n", num);
                        n--;
                }
        }
        else
        {
                printf("NO.%d not been found!\n", num);
        }
END:
        return head;
}

struct student *insert(struct student *head, struct student *head_2)
{
        struct student *p0, *p1, *p2;
        p0 = head_2;
        p1 = head;
        p2 = head;
        if (p1 == NULL)
        {
                head = p0;
                p0->next = NULL;
        }
        else
        {
                while (p0->num >p1->num && p1->next != NULL)
                {
                        p2 = p1;
                        p1 = p1->next;
                }
                if (p0->num <= p1->num)
                {
                        if (p1 == head)
                        {
                                head = p0;
                        }
                        else
                        {
                                p2->next = p0;
                        }
                        p0->next = p1;
                }
                else
                {
                        p1->next = p0;
                        p0->next = NULL;
                }
        }
        n++;
e:        return head;
}

struct student *clear(struct student *head)
{
        head = NULL;
        n = 0;
        printf("以清除全部记录!\n");
        return head;
}

void change(struct student *head, int num, float score)
{
        struct student *p1, *p2;
        if (head == NULL)
        {
                printf("This is a NULL!\n");
                goto end_2;
        }
        p1 = head;
        while (p1->num != num&&p1->next != NULL)
        {
                p2 = p1;
                p1 = p1->next;
        }
        if (p1->num == num)
        {
                p1->score = score;
        }
        else
        {
                printf("NO.%d not been found!", num);
        }
end_2:
        printf("");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-14 12:59:52 | 显示全部楼层
去年刚学的时候写的 运行没问题就是算法........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-14 15:42:17 | 显示全部楼层
牡丹,你让我们情何以堪啊,只能敬佩!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-14 19:25:34 | 显示全部楼层
发个C++版本的
#include <iostream>
using namespace std;

struct Node;
class List {
public:
        typedef Node* Iterator;
        List();
        ~List();
        Iterator begin()const{ return _first; }
        Iterator end()const{ return 0; }
        Iterator find( int number );
        void insert( Iterator iter, int number );
private:
        Iterator _first;
};

void init( List& list );
void print( const List& list );

int main() {
        List list;
        init( list );
        print( list );
        List::Iterator it = list.find( 5 );
        if( it ) list.insert( it, 100 );
        print( list );
}


struct Node {
        int _data;
        Node* _next;
        Node( int data, Node* next = 0 ):_data(data), _next(next){}
        List::Iterator& next() { return  _next; }
};

List::List():_first(0) {}
List::~List() {
        while( _first ) {
                Iterator tmp = _first->next();
                delete _first;
                _first = tmp;
        }
}

List::Iterator List::find( int number ) {
        Iterator tmp = _first;
        while( tmp && tmp->_data != number ) tmp = tmp->next();
        return tmp;
}

void List::insert( List::Iterator iter, int number ) {
        Iterator tmp = new Node( number, iter );
        if( iter == _first ) { //在表头加
                _first = tmp;
        }  else {        //不在表头加
                Iterator pos = _first;
                while( pos->next() != iter ) pos = pos->next();
                pos->next() = tmp;
        }
}

void init( List& list ) {
        for( int i = 10; i>0; --i ) list.insert( list.begin() , i );
}

void print( const List& list ) {
        for( List::Iterator it = list.begin(); it != list.end(); it = it->next() )
                cout<<it->_data<<" ";
        cout<<endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-15 11:48:36 | 显示全部楼层
有大神回复了我们感觉只有有copy了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-18 10:12:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表