数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。相关的知识,希望对你有一定的参考价值。

一、单链表的建立

有了动态内存分配的基础,要实现链表就不难了。

所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:

1、数据域:用来存储本身数据

2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。

例:

typedef strUCt node

char name[20];
struct node *link;
stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。

定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。

下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。

#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node

char name[20];
struct node *link;
stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/

stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/

PRintf("不能分配内存空间!");
exit(0);

h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)

if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/

printf("不能分配内存空间!");
exit(0);

p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;

return(h);

main()

int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/

这样就写好了一个可以建立包含N个人姓名的单链表了。写动态内存分配的程序应注重,请尽量对分配是否成功进行检测。

引用自:www.knowsky.com/394874.html

谢谢采纳!
参考技术A 基于你的题目数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进...,
我们可以提供一份代码,适用于初学者的,
有别的要求也可以与我们联系,
联系我们需要提供你的问题和电子邮件,
有机会会帮你,肯定救急,
请用BaiduHi为我留言,

此回复针对所有来访者和需求者有效,

ES:\\C7A4B0425C8A2C6FAD8116214EE62CB9
参考技术B #include <stdio.h>
#include <stdlib.h>

struct node

int num;
struct node *next;
;
/*建立链表*/
struct node *creat(int n)

int x, i;
struct node *head, *p, *r;

head=(struct node*)malloc(sizeof(struct node));
r=head;
printf("请输入数字\r\n");
for(i=0; i<n; i++)

scanf("%d", &x);
p=(struct node*)malloc(sizeof(struct node));
p->num=x;
r->next=p;
r=p;

r->next=NULL;
return(head);

/*删除重复结点*/
void delet(struct node *head)

struct node *p, *q, *r;

p=head->next;
while(p!=NULL)

q=p;
while(q->next!=NULL)

r=q->next;
if(r->num==p->num)

if(r->next!=NULL)

q->next=r->next;
free(r);

else

q->next=NULL;
free(r);


else

q=r;


p=p->next;


/*排序*/
void sort(struct node *head)

struct node *p, *q, *small;
int temp;

for(p=head->next; p->next!=NULL; p=p->next)

small=p;
for(q=p->next; q!=NULL ;q=q->next)

if(q->num<small->num)
small=q;

if(small!=p)

temp=small->num;
small->num=p->num;
p->num=temp;



/*输出*/
void output(struct node *head)

struct node *pt;
pt=head->next;
while(pt!=NULL)

printf("%d\r\n", pt->num);
pt=pt->next;


void destroy(Node* head)

while (head)

Node* temp = head;
head = head->pstnext;
free(temp);



main()

int n;
struct node *head;

printf("输入数字的个数n\r\n");
scanf("%d", &n);
head=creat(n);

printf("输入的数字\r\n");
output(head);

delet(head);
printf("删除重复结点后输出数字\r\n");
output(head);

sort(head);
printf("排序后输出数字\r\n");
output(head);

destroy(head);
参考技术C 请独立完成作业 百度知道上所有的答案我都已经看过了
另:我是武斌本回答被提问者采纳

单链表的基本操作(c语言)——章节实验作业

单链表的基本操作(c语言)——章节实验作业

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<stdbool.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node* next;
}Node, *LinkList;
void Show_meau()   //菜单
{
    printf("**********************************\\n");
    printf("            WELCOME!\\n");
    printf("\\n");
    printf("\\t单链表的基本操作\\n\\n");
    printf("  \\t 1.查询\\t 2.插入\\n\\n");
    printf("  \\t 3.删除\\t 4.打印\\n\\n");
    printf("  \\t 5.计数\\t 6.销毁\\n\\n");
    printf("  \\t 7.退出\\t 8.建表\\n\\n");
    printf("\\n");
    printf("     输入相关序号实现相关功能!\\n");
    printf("**********************************\\n");
}
void InitList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
}
void Create_List(LinkList L)   //尾插法
{
    ElemType c;
    Node* r, * s;
    bool flag=true;
    r = L;
    printf("提示:输入$表示建表结束!\\n");
    while (flag==true)
    {
        c = getchar();
        if (c != \'$\')
        {
            s = (LinkList*)malloc(sizeof(Node));
            s->data = c;
            r->next = s;
            r = s;
        }
        else
        {
            flag = false;
            r->next = NULL;
        }
    }
    printf("建表完成!\\a");
    Sleep(2000);
}
void Search(LinkList L)
{
    int flag=1;
    Node* p;
    ElemType e;
    getchar();   //吸收换行符
    p = L->next;
    printf("请输入要查找的值:");
    e = getchar();
    while (p != NULL)
    {
        if (p->data != e)
            p = p->next;
        else
        {
            printf("该地址为:%p\\n", p);
            printf("输入0退出!\\n");
            scanf("%d", &flag);
            break;
        }
    }
    if (flag == 0)
        return;
    printf("查无此值!\\a");
    Sleep(2000);
}
void DispList(LinkList L)
{
    int n;
    LinkList p = L->next;
    if (p == NULL)
    {
        printf("表为空!\\a");
        Sleep(2000);
        return;
    }
    printf("打印值为:\\n");
    while (p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\\n\\n");
    while (1) {
        printf("输入0退出打印!\\n");
        scanf("%d", &n);
        if (n == 0)
            return;
        else
            printf("输入无效,请重新输入!\\n");
    }
}
int ListLength(LinkList *L)
{
    int n = 0;
    LinkList p = L;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    while (p->next != NULL)
    {
        n++;
        p=p->next;
    }
    n--;
    return n;
}
void Print_Length(LinkList L)
{
    int n = 1;
        while (1)
        {
            if (n == 1)
            {
                printf("表长为:%d\\n", ListLength(L));
                printf("输入0退出打印!\\n");
                scanf("%d", &n);
            }
            if (n == 0)
                return;
        }
}
void ListInsert(LinkList L)
{
    int i,j=0;
    ElemType e;
    LinkList p = L,  s;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    printf("当前表长为:%d\\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入插入的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\\n");
        }
        else
            break;
    }
    getchar();
    printf("请输入插入的值:");
    scanf("%c", &e);
    while (j < i  && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\\n");
        Sleep(2000);
        return;
    }
    else
    {
        s = (LinkList*)malloc(sizeof(Node));
        s->data = e;
        s->next = p->next;
        p->next = s;
        printf("插入成功!\\a");
        Sleep(2000);
    }
}
void ListDelete(LinkList L)
{
    int i, j = 0;
    ElemType e;
    LinkList p = L,  q;
    if (p->next == NULL)
    {
        printf("表为空!\\a\\n");
        Sleep(2000);
        return;
    }
    printf("当前表长为:%d\\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入删除值的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\\n");
        }
        else
            break;
    }
    getchar();
    while (j < i && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\\n");
        Sleep(2000);
        return;
    }
    else
    {
        q = p->next;
        if (p == NULL)
        {
            printf("查无此值!\\n");
            Sleep(2000);
            return;
        }
        e = q->data;
        p->next = q->next;
        free(q);
        printf("删除成功!\\a");
        Sleep(2000);
    }
}
void DestroyList(LinkList L)
{
    LinkList pre = L,  p = L->next;
    while (p != NULL)   //逐一释放
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
    printf("销毁成功!\\a");
    Sleep(2000);
}
int main()
{
    int n;
    LinkList L;     //头结点应为指针,因为调用DestroyList(L)时由手动释放(free())
    InitList(&L);   //注意栈区(自动释放)和堆区(手动释放)的销毁区别
    while (1) {
        system("cls");    //清屏函数
        Show_meau();
        printf("请输入1-8的数:");
        scanf("%d", &n);
        switch (n) {
        case 1:
            Search(L);
            break;
        case 2:
            ListInsert(L);
            break;
        case 3:
            ListDelete(L);
            break;
        case 4:
            DispList(L);
            break;
        case 5:
            Print_Length(L);
            break;
        case 6:
            DestroyList(L);    //注意栈和堆的销毁的区别
            break;
        case 7:
            printf("........正在退出中........");
            Sleep(3000);
            system("cls");
            printf("\\a退出成功!"),
                exit(0);
            break;
        case 8:
            Create_List(L);
            break;
        default:
            printf("\\a输入错误!请重新输入(1—8)!"),
                Sleep(2000);
            break;
        }
    }
    return 0;
}

以上是关于数据结构作业~急求~~~用c语言或c++ 使用单链表实现系统进程列表,完成插入、删除、查询等操作。的主要内容,如果未能解决你的问题,请参考以下文章

急求一道编程题

c/c++语言创建单链表新结点时为啥不直接用结点对象,如直接lnode p;而是非要用指针加malloc或new实现?

急求 程序代码 c/c++ 操作系统中的 处理机调度算法

C语言链表问题,作业编程。编好出现问题。高手看下。

单链表的基本操作(c语言)——章节实验作业

C++单链表的设计与实现